|
|
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Имеются две таблицы, нужно сделать несимметричный джойн. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В итоге должен получиться резалтсет: gkid1 f1 id2 f211'a'1'A'11'a'2'B'11'a'3'C'12'b'21'c'1'D'21'c'2'E'31'd'То есть все строки таблицы a2 должны соединиться только с одной строкой из таблицы a1 (у которой id1=1), естественно учитывая связь по ключу группы (gk). Спрашивается, как это сделать в одни-единственный select? Задачу можно с легкостью решить через объединение или временные таблицы, но это решение будем считать неспортивным :) Решение нужно для ASE 12.5. Модератор: Тема перенесена из форума "Sybase ASA, ASE, IQ". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 20:56 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
это видимо, так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 21:28 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Усложним условие :) А если не использовать 'left join on'? Как это сделать через отношение *= внутри where? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 21:39 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Сведем вопрос к философским: 1. Как в реляционной модели выглядит множество " несколько отсутствий строк"? 2. Как выглядит условие запроса для его получения? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 21:47 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
White OwlУсложним условие :) А если не использовать 'left join on'? Как это сделать через отношение *= внутри where?А что можно испорльзовать? Альтернативный синтаксис? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 10:04 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: Я вот не понял, тебе шашечки, или ехать надо ? Чего хочешь-то ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 10:08 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Ну а вы как думаете, чего я могу хотеть? Есть гигантский запрос, сделанный в стиле *= вместо join. В него надо добавить еще одну таблицу как я уже описал. А я не могу придумать как описать это несимметричное соединение на *= синтаксисе. Можно конечно переправить его на join синтакс, но мне уже просто любопытно а можно ли это вообще сделать на *=? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 17:32 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Если использовать твои данные, то внешнее соединение должно работать, но в общем случае твоё условие "(у которой id1=1)" (как я понял, если id1=1, то a1 соединяем с a2, в противном случае выводим только a1) внешним соединением так просто не реализуется, потому как сначала выполняется соединение независимо от значения id1, а затем вычисляются предикаты. Уточни, пзл., условие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 17:40 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
White Owlможно ли это вообще сделать на *=?Подзреваю, что напрасно "Тема перенесена из форума "Sybase ASA, ASE, IQ"." Это что за *= такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 17:51 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Ну а вы как думаете, чего я могу хотеть? Есть гигантский запрос, > сделанный в стиле *= вместо join. В него надо добавить еще одну таблицу > как я уже описал. А я не могу придумать как описать это несимметричное > соединение на *= синтаксисе. переписывай на JOIN-ы. > Можно конечно переправить его на join синтакс, но мне уже просто > любопытно а можно ли это вообще сделать на *=? Лучше пол-дня просидеть, а потом за час долетесь. Переписывай. Давай текст если что, помогу. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 18:25 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Если это было правильно, Код: plaintext 1. то оно в старом синтаксисе будет выглядить так: Код: plaintext 1. 2. 3. Но если бы условие было бы a2.xxx=1 , то когда проверялось бы условие, ДО join-а, или ПОСЛЕ join-а, сказать было бы нельзя (сервер мог бы делать как угодно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 18:29 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
explaЕсли использовать твои данные, то внешнее соединение должно работать, но в общем случае твоё условие "(у которой id1=1)" (как я понял, если id1=1, то a1 соединяем с a2, в противном случае выводим только a1) внешним соединением так просто не реализуется, потому как сначала выполняется соединение независимо от значения id1, а затем вычисляются предикаты. Уточни, пзл., условие. Нет. Ваше предположение неверно. О том, когда будет проверяться это условие, вообще ничего сказать нельзя . Оно может проверяться когда угодно. Т.е. и до, и после JOIN-а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 18:31 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
White OwlНу а вы как думаете, чего я могу хотеть? Ещё можно вставить в список вывода поля, вытащенные подзапросом, или несколько полей, вытащенных подзапросами. Там может быть CASE, там уже легче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 18:33 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
MasterZivЕсли это было правильно, ... то оно в старом синтаксисе будет выглядить так: Да, запрос предложеный Q (через join), действительно выдает именно то что нужно. А вот твой запрос не работает, он выкидывает все записи из a1 в которых id1<>1. А их надо показывать. А впрочем, я уже сам придумал. Всего-то полтора дня убил :) Код: plaintext 1. 2. 3. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 19:20 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: Мой запрос и не должен был работать. > select a1.gk, a1.id1, a1.f1, a2.id2, a2.f2 > from a1, a2 > where (a1.id1=1 and a1.gk*=a2.gk) or (a1.id1<>1 and a2.gk is null) > > Вот это действительно будет аналогом запроса не будет. когда вычисляется условие a1.id1=1 ? До или после join-а ? когда вычислятся a2.gk is null ? До или после join-а ? На все эти вопросы ответить нельзя. Так что тебе надо переписывать через JOIN-ы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 23:04 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
еще один существенный аргумент за join -- план выполнения (...*=...) or (...) приведет к nested loops table seek X table seek Это может иметь последствия для "запроса из 30 таблиц" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 02:07 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
MasterZivНет. Ваше предположение неверно. О том, когда будет проверяться это условие, вообще ничего сказать нельзя . Оно может проверяться когда угодно. Т.е. и до, и после JOIN-а. Я говорю не о физическом выполнении операции соединения, а о логике выполнения запроса. Логически сначала выполняется декартово произведение отношений, затем вычисляются предикаты и отбрасываются ненужные записи. Так что условие id1=1 приведёт только к тому, что из результирующей выборки будут просто удалены все записи, которые этому условию не удовлетворяют (а в контрольном примере они есть). Но с семантикой ключевого слова left JOIN я плохо знаком, возможно она отличается от =... (+) или *=. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 04:02 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
explaMasterZivНет. Ваше предположение неверно. О том, когда будет проверяться это условие, вообще ничего сказать нельзя . Оно может проверяться когда угодно. Т.е. и до, и после JOIN-а. Я говорю не о физическом выполнении операции соединения, а о логике выполнения запроса. Логически сначала выполняется декартово произведение отношений, затем вычисляются предикаты и отбрасываются ненужные записи. Так что условие id1=1 приведёт только к тому, что из результирующей выборки будут просто удалены все записи, которые этому условию не удовлетворяют (а в контрольном примере они есть). Но с семантикой ключевого слова left JOIN я плохо знаком, возможно она отличается от =... (+) или *=. лефт эт он пристраивается слева и сует до конца все что имеется хоть и некуда :( декарт не был садистом а коодд ууууууууууууууууууууууууууууууу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 04:13 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Сахават Юсифов, да воще декарт тут не причем все грниды а главынй му**к кантор тольок блин на мельких базарах и ценят за то что можно нае..ать с кантором можно конечено и с декартом но это уже групповуха ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 04:15 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Q пишет: > Автор: Q > еще один существенный аргумент за join -- план выполнения (...*=...) or > (...) приведет к nested loops table seek X table seek Чем это ж тебе nested loop не угодил ? Самое то что надо. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 10:51 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
expla пишет: > Я говорю не о физическом выполнении операции соединения, а о логике > выполнения запроса. Логически сначала выполняется декартово произведение Нифига. Именно о логике выполнения и нельзя ничего сказать. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 10:52 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
Сахават Юсифов пишет: > да воще декарт тут не причем Это у вас чего, обострение ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 10:53 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
MasterZiv Чем это ж тебе nested loop не угодил ? Самое то что надо. Nested loops сам по себе меня устраивает, меня беспокоят его внутренности. Лучше бы там были index seek, bookmark lookup... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 11:00 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
MasterZivМой запрос и не должен был работать.ээээ.... а зачем писать неработающий запрос??? MasterZiv> select a1.gk, a1.id1, a1.f1, a2.id2, a2.f2 > from a1, a2 > where (a1.id1=1 and a1.gk*=a2.gk) or (a1.id1<>1 and a2.gk is null) > > Вот это действительно будет аналогом запроса не будет.Судя по результату - это действительно аналог. Так что можешь не спорить. Если не веришь - проверь. Я оба запроса прогонял на ASE12.5. У тебя есть доступ до такой базы? Что-то мне подсказывает что есть :) MasterZivТак что тебе надо переписывать через JOIN-ы.С точки зрения скорости запроса - ой надо.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 18:15 |
|
||
|
Задачка для любителей поломать голову.
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > ээээ.... а зачем писать неработающий запрос??? Чтобы рассказать, как можно было бы написатЬ, но сказать, что не будет работать. И чтобы все видели, как нельзя писать. > Судя по результату - это действительно аналог. Так что можешь не > спорить. Если не веришь - проверь. Я оба запроса прогонял на ASE12.5. У > тебя есть доступ до такой базы? Что-то мне подсказывает что есть :) Даже если он работает, то это не значит, что он будет работать всегда и везде. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 20:36 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35718242&tid=1543523]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
189ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 451ms |

| 0 / 0 |
