08.09.2005, 12:04 | #1 |
Участник
|
Помогите с query
Есть таблица1, таблица2, таблица3. У которых есть общее поле itemId(у таблиц таблица2 и таблица3 может дублироваться).
Надо получить query такое что в нем будут только те записи, для которых itemId есть в третей или во второй таблице. |
|
08.09.2005, 12:51 | #2 |
Участник
|
что вроде этого пойдет ?:
Query q; QueryBuildDataSource qbr, qbr2, qbr3; ; qbr = q.addDataSource(tablenum(Table1)); qbr2 = qbr.addDataSource(tablenum(Table2)); qbr2.addLink(tablenum(Table1, ItemId), tablenum(Table2, ItemId)); qbr2.joinMode(JOINMODE::ExistsJoin); qbr3 = qbr.addDataSource(tablenum(Table3)); qbr3.addLink(tablenum(Table1, ItemId), tablenum(Table3, ItemId)); qbr3.joinMode(JOINMODE::ExistsJoin); |
|
08.09.2005, 12:58 | #3 |
Участник
|
так я тоже пробовал
Этот запрос join-ит по пересечению таблиц 2 и 3 так что не подходит |
|
08.09.2005, 13:00 | #4 |
Участник
|
2 Bega
Неа. Не правильно. На сервер пойдут отдельные запросы для каждой таблицы 2 барсук PHP код:
__________________
Axapta v.3.0 sp5 kr2 |
|
08.09.2005, 13:32 | #5 |
Участник
|
2 AndyD
вопрос как в этот запрос оставляет в таблице 1, те записи из таблицы 3 которых нет в таблице 2? |
|
08.09.2005, 13:45 | #6 |
Гость
|
Цитата:
Изначально опубликовано 6apcyk
2 AndyD вопрос как в этот запрос оставляет в таблице 1, те записи из таблицы 3 которых нет в таблице 2? |
|
08.09.2005, 13:46 | #7 |
Гость
|
можете добавить в базу знаний: 2 экзист джойна эквивалентны экзист + иннер джойну
|
|
08.09.2005, 14:05 | #8 |
Участник
|
На чистом SQL это выглядело бы так:
select Table1.* from Table1 left join Table2 on Table2.ItemId = Table1.ItemId left join Table3 on Table3.ItemId = Table1.ItemId where not Table2.ItemId is null or not Table3.ItemId is null --либо select Table1.* from Table1 where exists(select * from Table2 where Table2.ItemId = Table1.ItemId) or exists(select * from Table3 where Table3.ItemId = Table1.ItemId) В одном Query такое наверное не сделаешь. |
|
08.09.2005, 14:11 | #9 |
Гость
|
единственное решение, которое приходит на ум - создать вьюшку из table2 и table3 и полями соотв itemid2, itemid3 и в запросе писать table1.itemid == view.itemid2 || table1.itemid == view.itemid3
|
|
08.09.2005, 14:17 | #10 |
Участник
|
Извиняюсь, неправильно прочитал условия.
Я предлагал для выбора по "И"
__________________
Axapta v.3.0 sp5 kr2 |
|
08.09.2005, 14:47 | #11 |
Участник
|
Мне кажется, что сделать это через Query - не получится.
Дело в том, что Query собирает все условия через AND. Вписать OR получается далеко не всегда. Обычно для этого приходится сильно "извращаться". Стандартное решение - это делать Query по первой таблице, а внутри перебора полученных записей (while (QueryRun.next())) проверять факт вхождения во вторую или третью. "НЕ стандартное" - это формировать запрос напрямую на сервере через объект Connection. |
|
08.09.2005, 15:04 | #12 |
Участник
|
Если вопрос в том, чтобы пробежать по Query и получить значения, то это можно реализовать. Но мне кажется, что данном случае речь идет о визуализации. 2 6apcyk?
__________________
Axapta v.3.0 sp5 kr2 |
|
08.09.2005, 16:07 | #13 |
Гость
|
Цитата:
Изначально опубликовано Владимир Максимов
Мне кажется, что сделать это через Query - не получится. |
|
08.09.2005, 16:16 | #14 |
Участник
|
Цитата:
Изначально опубликовано ahtoh
я выше написал, как это можно сделать Причем не совсем ясно, как предполагается делать вьюшку. Ведь в этом случае нужно объединение по FULL JOIN. Иначе условие OR не получиться. Я не в курсе, можно такое во вьюшке сделать? |
|
08.09.2005, 16:43 | #15 |
Гость
|
что значит не query
а full join сделать проще некуда - relations не указываешь да и все попробуй на досуге выполнить select ledgertrans join ledgertrans2 поймешь, что джойн тут cамый, что ни на есть ФУЛЛ |
|
08.09.2005, 17:10 | #16 |
Участник
|
Получите декартово произведение, т.е. каждая запись из таблицы1 будет объединяться с каждой записью из таблицы2. В результате кол-во записей во view будет count(таблица1) * count(таблица2)
__________________
Axapta v.3.0 sp5 kr2 |
|
08.09.2005, 17:20 | #17 |
Участник
|
Цитата:
Изначально опубликовано AndyD
Получите декартово произведение, т.е. каждая запись из таблицы1 будет объединяться с каждой записью из таблицы2. В результате кол-во записей во view будет count(таблица1) * count(таблица2) Основная цель - это получить во View полный набор значений ItemId, как из второй, так и из первой таблицы (объединение значений). Это можно сделать через UNION, FULL JOIN или через декартово произведение. Суть не измениться. Хотя, конечно, при декартовом произведении записей будет больше всего. Дальше уже надо смотреть, что получиться быстрее - такая вьюха или перебор в цикле. |
|
08.09.2005, 17:46 | #18 |
Участник
|
Зачем перебор в цикле?
PHP код:
По повод view - каким образом объединять ее с table1? Ведь в результате получим соответствующие увеличение кол-ва записей для датасорса. Единственное верное решение в данном случае - использование UNION. Как грязный xак - можно подправить view на сервере
__________________
Axapta v.3.0 sp5 kr2 |
|
08.09.2005, 18:07 | #19 |
Участник
|
Приведенный код не решает поставленную задачу. У тебя получилось примерно следующее:
( Table1.ItemId = Table2.ItemId ) Декартово произведение (Table1.ItemId = Table3.ItemId AND Table3.ItemId NOT EXISTS(Table2.ItemId)) Вся проблема именно в том, что объединение пойдет не по типу UNION (что предполагается), а именно как декартово произведение. Представляешь количество "мусора"? А то, что предлагает ahtoh это примерно следующее: Table1.ItemId EXISTS((Table2.ItemId) декартово произведение (Table3.ItemId)) Поскольку составить такой Query не получится, то он предлагает то, что внутри Exists оформить как отдельный View. Все корректно. Вопрос только в скорости такой выборки. |
|
08.09.2005, 20:02 | #20 |
Участник
|
Нет, там по другому. На сервер пойдет два запроса результаты которых будут объеденены на клиенте. Обратите внимание table1 там добавляется два раза. Т.е получится следующее
datasource1(table1) - datasource3(table1) -------------------------------------- table1.itemid = table2.itemId - пусто table1.itemid = table2.itemId - пусто table1.itemid = table2.itemId - пусто пусто - table1.itemid = table3.itemId пусто - table1.itemid = table3.itemId пусто - table1.itemid = table3.itemId По поводу view я уже и сам понял, просто не учел про ExistsJoin Тут есть замечание - необходимо не Table1.ItemId Exists(), а Table1.Itemid IN. Как его задать - не предствляю себе. Если задавать ExistsJoin, то получается PHP код:
__________________
Axapta v.3.0 sp5 kr2 |
|