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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.07.2004, 11:21   #1  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
Не работают 2 notexists join
Проблема вот в чём:
В select е присутствуют сразу 2 notexists join
PHP код:
while select table1
             notexists join table2 where table2
.field1 == table1.field1
             notexists join table3 where table3
.field1 == table1.field1
{
   ......

так вот, выбираются только те записи из table1 которых нет в table2, а table3 совсем не принимается во внимание таблица table3.
Если же поменять местами
PHP код:
while select table1
            notexists join table3 where table3
.field1 == table1.field1
            notexists join table2 where table2
.field1 == table1.field1
{
   ......

будут выбраны записи из table1 которых нет в table3, и уже не воспринимается table2.
Помогите, как побороть эту беду?
Необходимо выбрать только те записи из table1 для которых нет аналогов ни в table2, ни в table3.
Старый 22.07.2004, 13:10   #2  
DavidA is offline
DavidA
Участник
 
12 / 10 (1) +
Регистрация: 20.07.2004
Адрес: Москва
можно сделать два select'a.
а еще можно left outer join и right outer join использовать (к сожалению, не помню, как аналоги называются).
Старый 22.07.2004, 14:01   #3  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
Цитата:
можно сделать два select'a.
Не поможет 2 отдельных селекта.
т.к.
к примеру
в Table1 содержится 1; 2; 3; 4; 5.
в Table2 содержится 2; 4.
в Table2 содержится 3; 4.
В результате должно получиться : 1; 5.
Старый 22.07.2004, 14:18   #4  
mtik is offline
mtik
Участник
 
15 / 10 (1) +
Регистрация: 22.07.2004
Адрес: г.Москва
По моему будет работать если сделать так:



while select table1


notexists join table2 where table2.field1 == table1.field1


notexists join table3 where table3.field1 == table2.field1
Старый 22.07.2004, 14:20   #5  
DavidA is offline
DavidA
Участник
 
12 / 10 (1) +
Регистрация: 20.07.2004
Адрес: Москва
1. создаем временную табличку

create #temptable
{
field1 nvarchar (20)
}

2. запускаем первый селект

insert into #temptable (field1)
select нужноеполе
from table t1 inner join table1 t2
where t1.нужноеполе != t2.нужноеполе

3. запускаем второй селект
select нужноеполе
from #temptable t3 inner join table t2
where t3.нужноеполе != t2.нужноеполе

должно сработать.
Старый 22.07.2004, 14:33   #6  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
2 mtik
Цитата:
По моему будет работать если сделать так:
Проверил, к сожалению результат тот же - второй notexists join не воспринимается.

2 DavidA
Вся идея была в том, что бы обойтись одним запросом, и средствами Аксапты.
Старый 22.07.2004, 14:47   #7  
DavidA is offline
DavidA
Участник
 
12 / 10 (1) +
Регистрация: 20.07.2004
Адрес: Москва
хм...
пришлите весь код запроса.
Старый 22.07.2004, 14:56   #8  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
Цитата:
пришлите весь код запроса.
Так ведь запрос, который, как я считаю, работает не правильно, я привёл выше.
Старый 22.07.2004, 15:02   #9  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Не будут правильно работать ни два notexists join, ни два outer join к одной таблице - смотрите на формируемый запрос
Старый 22.07.2004, 15:15   #10  
DavidA is offline
DavidA
Участник
 
12 / 10 (1) +
Регистрация: 20.07.2004
Адрес: Москва
В SQL'е я бы предложил связывать таблицы по inner join, благо есть общие поля, а все условия выборки переносить в where. Уверен, что и в X++ следует использовать подобный механизм.
Старый 22.07.2004, 16:11   #11  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
2DavidA
Цитата:
В SQL'е я бы предложил
Так в SQL'e будут работать без проблем и 2 и 3 и более NOT EXISTS.
Проблема состоит в том что Аксапта не корректно формирует запрос для SQL'а . А точнее не правильно расставляет скобки.
Вот что показали иследования:
после того как будет встречена конструкция notexists join и потом следуют другие join'ы Аксапта помещает селекты относящиеся к этим join'ам в скобки первого notexists join.
Старый 22.07.2004, 16:22   #12  
DavidA is offline
DavidA
Участник
 
12 / 10 (1) +
Регистрация: 20.07.2004
Адрес: Москва
Любопытное сведение. Спасибо, что раскопали.

то есть если написать

while select table1
notexists join table2 where table2.field1 == table1.field1 && table3.field1 == table1.field1
notexists join table3

то пройдет выборка по трем таблицам?
Старый 22.07.2004, 16:32   #13  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
Нет!
Второй notexists не будет выполняться.
Старый 23.07.2004, 13:49   #14  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Эта бага еще со времен 2.1 висит.
Средствами ахарты ветвящиеся запросы не иннер джойн НЕ СТРОЯТСЯ.
Только плоские.
т.е. можно попробовать как - нибудь развернуть этот запрос в цепочку
таб2 - таб1 - таб3

пытайтесь....

Альтернатеива одна - временная таблица.
За это сообщение автора поблагодарили: savel (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX UK: Join the Virtual Partner Community Blog bot DAX Blogs 0 26.03.2008 04:17
Глюки в Query с разными типами Join (в т.ч. NonExistsJoin) к одной таблице gl00mie DAX: Программирование 10 14.02.2007 13:22
Проблема с Exists Join Morpheus DAX: Программирование 5 14.08.2006 18:22
2 и более OUTER JOIN к одному паренту Ronin DAX: Программирование 21 19.12.2005 13:42

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:31.