Flot
Гость
|
|
« : 17-05-2004 12:53 » |
|
Подскажите пожалуйста, есть ли во встроенном SQL InterBase-а или FireBird-а команды пересечения/вычитания запросов. В стандарте SQL эти команды декларируются, но в IB5 не поддерживаются. Сейчас встал вопрос о переходе на более новую (чем IB5) платформу и наличие возможности получения пересечения/вычитания запросов будет немаловажным при решении, на что переходить.
Спасибо всем, кто откликнется.
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #1 : 17-05-2004 12:58 » |
|
P.S. Чуть расширю свой вопрос -- реализована ли возможность таких запросов на других платформах.
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #2 : 17-05-2004 13:22 » |
|
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
Flot
Гость
|
|
« Ответ #3 : 18-05-2004 04:56 » |
|
Документацию на FB 1.5 я смотрел и там этого не нашел. Возможно я был невнимателен Возможно это есть в IB 7. Возможно это реализовано на других платформах. А суть вопроса в следующем. Есть 2 запроса, например: Select * from Table1 и Select * from Table2 (для простоты будем считать, что таблицы имеют одинаковую структуру). Тогда Select * from Table1 Union Select * from Table2 дает объединение таблиц. В стандарте SQL кроме объединения прописана возможность найти пересечение запросов: Select * from Table1 Intersect Select * from Table2 (что то типа, возможно синтаксис другой). Такой запрос должен давать выборку записей входящих сразу в обе таблицы. В принципе, все остальное можно построить из этих двух операций. Мой вопрос именно о том, есть ли в ID/FB реализация аналога Intersect. И дополнение -- возможно это реализовано на других платформах (хоть на Oracle я надеюсь это есть ).
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #4 : 18-05-2004 05:28 » |
|
Глянул документацию на Yaffil (спасибо за ссылки). К сожалению, как и в FB возможности пересечения запросов не нашел. Странно, что такая полезная возможность (особенно при всякого рода конвертациях) самого SQL-я не поддерживается. Мне казалось, что техническая реализация этого не сложнее реализации Union.
По ходу родился еще один вопрос. В описании Yaffil нашел, что a==b обращается в True и тогда, когда a=null, b=null. есть ли такое в FB/IB? Эта особеннсость совместно с Join пусть криво, но позволяет эмулировать Intersect.
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #5 : 18-05-2004 06:32 » |
|
Попробуте задать ваш вопрос в этой конференции: news://forums.demo.ru/epsylon.public.interbase В ней постоянно присутствуют разработчики FB и Yaffil. Может быть сумеете договориться с ними, чтобы они включили интересующие вас возможности в следующие сборку или версию, или хотя-бы в виш-лист.
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #6 : 18-05-2004 06:34 » |
|
Flot, в явном виде такой возможности нет. но получить записи, входящие в обе таблицы, по некоему условию (равенство нескольких или всех полей) можно элементарно обычным where. видимо поэтому разработчики и не заморачивались сомнительными с точки зрения чистого SQL альтернативами...
пересечение кортежей - одна из базовых операций реляционной алгебры, я не знаю СУБД, где бы это не поддерживалось. другой вопрос - как.
что, жизненно важно, чтобы это делалось именно отдельным оператором уровня union?
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #7 : 18-05-2004 07:33 » |
|
Спасибо за ответы.
x77, что касается "жизненой важности", то единственное желание -- получить пересечение ОДНИМ SQL-ЗАПРОСОМ. Несмотря на ваше утверждение про возможность реализации пересечения кортежей оператором where (или join, как это делаю сейчас я) позвольте с вами не согласиться. Все хорошо и прекрасно (правдо громоздко и неудобно, если пересечение необходимо проводить по нескольким десятком полей) лишь до тех пор, пока поля сравнения не содержат значений null. Как только это происходит, в запросе эмулирующем пересечении с помощью where или join пропадут записи, содержащие null в полях сравнения (что связано с тем, что выражение типа null=null не обращается в True, и именно поэтому меня так порадовала возможность избежать этого в Yaffil [о чем я говорил в предидущем посте]). Ну и плюс к этому, чисто методически логично базовые понятия SQL (как вы совершенно правильно заметили) разработчикам реализовывать одной командой, а не предлагать пользователям придумывать колесо по этому поводу (хотя этот коммент больше риторический).
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #8 : 18-05-2004 09:35 » |
|
"null=null в ТRUE" - правильно. есть масса способов реализовать сравнение корректно, начиная от забивки предустановленных "нуловых" значений, и заканчивая обычными операторами сравнения: (a1 is null) and (a2 is null). вопрос о том, что удобнее - писать два запроса или один с разветвлённым where clause мне лично представляется спорным. не думаю, что в общем виде на него можно ответить, надо рассматривать конкретные примеры.
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #9 : 18-05-2004 10:15 » |
|
Представьте себе, x77, что вы конвертите с 5-ток - другой таблиц, каждая из которых имеет с пару - другую десятков полей. И вы не имеете права забивать в них null-ы (ну скажем по причине того, что null в них несет некую информацию) ... ладно, пусть не так сложно Пусть есть 2 таблицы, в которых по 2 поля A(a1, a2) и B(b1, b2). Нужно найти их пересечение при условии, что в любое поле может принимать значение null. Да, наверное существует множество вариантов написать такой запрос. Мне на ум приходит лишь объединение 3-ех запросов, где последовательно сравниваются A и B при условии 1) a1 is not null and a2 is not null (сравнение по a1=b1 and a2=b2) 2) a1 is not null and a2 is null (сравнение по a1=b1) 3) a1 is null and a2 is not null (сравнение по a2=b2) Так что, ТЕОРЕТИЧЕСИ такой запрос написать можно, но представьте себе, на что он будет похож при хотя бы 10 - 15-ти полях сравнения! Поэтому, несмотря на принципиальную ТЕОРЕТИЧЕСКУЮ возможность написать такой запрос, его ПРАКТИЧЕСКОЕ использование вряд ли возможно при больших количествах полей сравнения. А по сути это означает отсутствие такой возможности.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #10 : 18-05-2004 10:44 » |
|
Flot, не согласен как, по вашему, реализуется where? насколько я в курсе, пермножением матриц. как будет реализовываться intersect? неужто как-то иначе? ведь там придётся учитывать те же самые нулы. так в чём разница? в удобочитаемости? не самый важный критерий при выборе субд, imho.
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #11 : 18-05-2004 11:14 » |
|
x77, мы же используя Union (и where тоже ) не задумываемся о том, как оно функционирует внутри движка. Мы просто знаем, что будет на выходе. Программисты даже термин для этого придумали -- инкапсуляция (нехристи немытые, могли бы назвать 'концы в воду', например ). А если довести ваше утверждение до маразма, то тогда из SQL-я придется убрать много еще чего, сославшись, что все это можно построить из Select и where. И еще, не забывайте, x77, что все мы люди. А всем людям свойственно а) Лениться (писать большие скрипты) б) Ошибаться (при их написании) Так что молодцы мужики из команды Yaffil, что ввели оператор "==", который обрабатывает сравнение null-ов (хоть это и не повод на "дятла" переходить). Я извиняюсь, но все же напомню (переформулировав) свой вопрос: 1) Есть ли в FB/IB команда пересечения запросов (надежда осталась вроде как только на IB7) или а) хотя бы операции сравнения a=b -> True (при a=null, b=null) 2) В каких платформах эти особенности реализованы? Спасибо.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #12 : 18-05-2004 11:18 » |
|
Flot,
1) нет 2) yaffil 3) DB2, Informix, Oracle.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #13 : 18-05-2004 11:23 » |
|
могу ещё добавить, что sql'92 реализован на нескольких уровнях. INTERSECT - это intermediate level, а большинство коммерческих продуктов не идут дальше entry level, справедливо (на мой взгляд - ) указывая, что оператор примитивным не является.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #14 : 18-05-2004 11:24 » |
|
имеется в виду, INTERSECT
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #15 : 18-05-2004 11:26 » |
|
да, ещё subj поддерживается в PostgreSQL.
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #16 : 18-05-2004 11:36 » |
|
Спасибо, x77. Надо будет на счет Oracle подумать. ... И про Informix почитать.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #17 : 18-05-2004 11:41 » |
|
а Postgre - не нравится? как и у оракла, реализация SQL у него ближе к sql'99, а не 92. т.е., сия субд имеет наглость считать себя объектно ориентированной. Плюс великолепно живёт под линухом, легко прикручивается к PHP, и многое другое если же веб не нужен - обычная двух-звенка.
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #18 : 18-05-2004 12:06 » |
|
Про Postgre я не слышал почти ничего (ни плохого ни хорошего) Вот и прокинул его А в смысле администрирования он так же тяжел, как Oracle? Да и вообще то, если бы ни необходимость частых (и возможно изменчивых в смысле источника) конвертаций, то перешел бы на FB 1.5 и не думал бы. А так вот стал искать себе возможность жизнь облегчить. Еще маленький вопрос, нет ли ссылок на документацию, где четко прописано, какие операторы SQL реализованы в FB 1.5? В той, что к нему прилагается я только то, что добавлено нашел (может все остальное в FB 1.0 есть?). А то методом "тыка" все как-то больше приходится обучаться (т.е. непосредственной проверкой операторов -- выполянться/не_выполняться). А что же это за обучение.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #19 : 18-05-2004 12:22 » |
|
собственно, те же, что и в IB 6.0.1. что-то добавилось, конечно, но это есть в release_notes, http://www.ibase.ru/v6/Firebird_v15_ReleaseNotes1.htm, например. ещё стоит порыться на firebirdsql.org и ibphoenix.com
|
|
|
Записан
|
|
|
|
Flot
Гость
|
|
« Ответ #20 : 18-05-2004 12:29 » |
|
Спасибо, x77, гляну.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #21 : 18-05-2004 12:33 » |
|
удачи
|
|
|
Записан
|
|
|
|
|