AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2007, 12:18   #1  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Помогите с запросом
Подскажите, как решить следующую задачу:
Имеем две таблицы Таблица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  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,690 / 405 (17) +++++++
Регистрация: 23.03.2006
почему бы не использовать 1 exists join? и все условия описать в where
Старый 28.05.2007, 12:23   #3  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
О Боже...
X++:
While select table1 where table1.itemid == table2.itemid &&
(table2.feature == tmp1 || table2.feature == tmp2  ...)
Так не пойдет?
Старый 29.05.2007, 11:14   #4  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от Sada Посмотреть сообщение
О Боже...
X++:
While select table1 where table1.itemid == table2.itemid &&
(table2.feature == tmp1 || table2.feature == tmp2  ...)
Так не пойдет?
К сожалению не пойдет.
Потому что нужно выбрать записи, которые содержат все критерии, а не хотя бы один. Вот если бы в вашем примере вместо ИЛИ можно было использовать И, тогда это было бы похоже на то что нужно.
Старый 29.05.2007, 11:15   #5  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от ice Посмотреть сообщение
почему бы не использовать 1 exists join? и все условия описать в where
это был бы идеальный вариант, но как написать такое условие?
Старый 29.05.2007, 11:18   #6  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от leshy Посмотреть сообщение
К сожалению не пойдет.
Потому что нужно выбрать записи, которые содержат все критерии, а не хотя бы один. Вот если бы в вашем примере вместо ИЛИ можно было использовать И, тогда это было бы похоже на то что нужно.
А в чем проблема используйте И.
Старый 29.05.2007, 11:30   #8  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,690 / 405 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от miklenew Посмотреть сообщение
А в чем проблема используйте И.
не поможет
Старый 29.05.2007, 11:31   #9  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от miklenew Посмотреть сообщение
А в чем проблема используйте И.
miklenew можете привести пример запроса?
Пусть мы имеем Таблица 1
ItemId
1
2
3
Таблица 2
ItemId Feature
1 A
1 B
1 C
2 A
2 C
3 B

Мне нужно выбрать товар, который содержит харктеристики А, B и С.
Старый 29.05.2007, 11:45   #10  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
X++:
While select table1 where table1.itemid == table2.itemid &&
table2.feature == A && table2.feature == B && table2.feature == C
{

}
Старый 29.05.2007, 11:50   #11  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от Sada Посмотреть сообщение
X++:
While select table1 where table1.itemid == table2.itemid &&
table2.feature == A && table2.feature == B && table2.feature == C
{

}
Я был бы удивлен если бы данный запрос сработал. Но на всякий случай проверил, - не выводит ничего. Может я что не так делаю?
Старый 29.05.2007, 11:51   #12  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от leshy Посмотреть сообщение
miklenew можете привести пример запроса?
Мне нужно выбрать товар, который содержит харктеристики А, B и С.
While select table1
{
select table2 where table2.itemid == table1.itemid && table2.feature == A && table2.feature ==B && table2.feature ==C
if (table2)
в контйнер или куда нибудь
}
Старый 29.05.2007, 11:55   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
А у вас в Таблице 2 пары ItemId, Feature уникальны?
__________________
Axapta v.3.0 sp5 kr2
Старый 29.05.2007, 11:56   #14  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от Sada Посмотреть сообщение
table2.feature == A && table2.feature == B
Цитата:
Сообщение от miklenew Посмотреть сообщение
table2.feature == A && table2.feature ==B
X++:
(table2.feature == A && table2.feature == B) == false
Всегда.
__________________
С уважением,
Олег.
Старый 29.05.2007, 12:04   #15  
Ed1k is offline
Ed1k
Участник
 
102 / 42 (2) +++
Регистрация: 19.07.2006
Цитата:
Сообщение от leshy Посмотреть сообщение
Пусть мы имеем Таблица 1
ItemId
1
2
3
Таблица 2
ItemId Feature
1 A
1 B
1 C
2 A
2 C
3 B

Мне нужно выбрать товар, который содержит харктеристики А, B и С.
select ItemId from table1
group by ItemId
join TableId from table2
where (table2.ItemId == table1.ItemId) &&
((table2.Feature == "A") || (table2.Feature == "B"))
Старый 29.05.2007, 12:06   #16  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от AndyD Посмотреть сообщение
А у вас в Таблице 2 пары ItemId, Feature уникальны?
Да, уникальны
Старый 29.05.2007, 12:08   #17  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Я join забыл
Старый 29.05.2007, 12:11   #18  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от Ed1k Посмотреть сообщение
select ItemId from table1
group by ItemId
join TableId from table2
where (table2.ItemId == table1.ItemId) &&
((table2.Feature == "A") || (table2.Feature == "B"))
Вот если бы можно было переписать ваш запрос следующим образом:
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  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Это чо папало...Так низя...
Старый 29.05.2007, 12:13   #20  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Цитата:
Сообщение от Sada Посмотреть сообщение
Я join забыл
Я не забыл все равно не работает.
oip наглядно привел почему именно не будет работать
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помогите с запросом AvrDen DAX: Программирование 8 07.08.2007 15:24
Помогите с запросом Antonuch DAX: Программирование 4 21.06.2007 15:46
помогите с запросом oleg_e DAX: Программирование 4 10.10.2006 13:04
Помогите с запросом.. DarkBear DAX: Программирование 2 15.08.2005 13:38
Помогите с SQL запросом malex DAX: Программирование 8 26.07.2005 13:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:14.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.