28.05.2007, 12:18 | #1 |
Участник
|
Помогите с запросом
Подскажите, как решить следующую задачу:
Имеем две таблицы Таблица1 и Таблица2. Таблица 1 содержит перечень товаров. Таблица 2, содержит некий набор характеристик каждого товара: КодТовара, Характеристика. Связь 1:n. Необходимо выбрать все товары, имеющих заданный набор признаков. Попробовал решить задачу с помощью Exists Join. Select Table1 Exists Join Table2 Where table2.itemId == table1.itemId && table2.feature == 1 Exists Join Table2 Where table2.itemId == table1.itemId && table2.feature == 2 Exists Join Table2 Where table2.itemId == table1.itemId && table2.feature == 3 И т д. Это отлично работает пока количество условий меньше 26. Если же условий 26 и больше система сообщает об ошибке. Если посмотреть в профайлер, то можно увидеть, что для каждой присоединенной таблицы, система присваивает имя a, b, c, d и т д. После символа «z» следующей переменной присваивается имя «[» на что SQL естественно ругается. Можно ли как-нибудь обойти эту ситуацию? Можно ли по-другому сформулировать запрос, чтобы уменьшить количество объединений? Axapta 3.0.SP3 |
|
28.05.2007, 12:23 | #2 |
Участник
|
почему бы не использовать 1 exists join? и все условия описать в where
|
|
28.05.2007, 12:23 | #3 |
Программатор
|
О Боже...
X++: While select table1 where table1.itemid == table2.itemid && (table2.feature == tmp1 || table2.feature == tmp2 ...) |
|
29.05.2007, 11:14 | #4 |
Участник
|
Цитата:
Потому что нужно выбрать записи, которые содержат все критерии, а не хотя бы один. Вот если бы в вашем примере вместо ИЛИ можно было использовать И, тогда это было бы похоже на то что нужно. |
|
29.05.2007, 11:15 | #5 |
Участник
|
|
|
29.05.2007, 11:18 | #6 |
Участник
|
|
|
29.05.2007, 11:23 | #7 |
Участник
|
|
|
29.05.2007, 11:30 | #8 |
Участник
|
|
|
29.05.2007, 11:31 | #9 |
Участник
|
|
|
29.05.2007, 11:45 | #10 |
Программатор
|
X++: While select table1 where table1.itemid == table2.itemid && table2.feature == A && table2.feature == B && table2.feature == C { } |
|
29.05.2007, 11:50 | #11 |
Участник
|
|
|
29.05.2007, 11:51 | #12 |
Участник
|
Цитата:
{ select table2 where table2.itemid == table1.itemid && table2.feature == A && table2.feature ==B && table2.feature ==C if (table2) в контйнер или куда нибудь } |
|
29.05.2007, 11:55 | #13 |
Участник
|
А у вас в Таблице 2 пары ItemId, Feature уникальны?
__________________
Axapta v.3.0 sp5 kr2 |
|
29.05.2007, 11:56 | #14 |
Axapta
|
|
|
29.05.2007, 12:04 | #15 |
Участник
|
Цитата:
group by ItemId join TableId from table2 where (table2.ItemId == table1.ItemId) && ((table2.Feature == "A") || (table2.Feature == "B")) |
|
29.05.2007, 12:06 | #16 |
Участник
|
|
|
29.05.2007, 12:08 | #17 |
Программатор
|
Я join забыл
|
|
29.05.2007, 12:11 | #18 |
Участник
|
Цитата:
select ItemId from table1 group by ItemId join count(TableId) from table2 where (table2.ItemId == table1.ItemId) && ((table2.Feature == "A") || (table2.Feature == "B") || (table2.Feature == "C")) && count(tableId) =3 3 - количество условий Последний раз редактировалось leshy; 29.05.2007 в 12:14. |
|
29.05.2007, 12:12 | #19 |
Программатор
|
Это чо папало...Так низя...
|
|
29.05.2007, 12:13 | #20 |
Участник
|
|
|
Теги |
ax3.0 |
|
Похожие темы | ||||
Тема | Ответов | |||
Помогите с запросом | 8 | |||
Помогите с запросом | 4 | |||
помогите с запросом | 4 | |||
Помогите с запросом.. | 2 | |||
Помогите с SQL запросом | 8 |
|