Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
Никак не могу дотумкать в чём проиахнулся, помогите пожалуйста:

Вот этот запрос:
select 	distinct AI.ID as АрИм

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015'))

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)

возвращает 38 записей, всё гут!

Идём дальше:
select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) left join
	_1scrdoc as Графы ON ((Графы.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (Графы.MDID='6034')) inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP6570 > AI.SP6572) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)

А вот этот запрос возвращает 37 записей. Понятно, что одному АрИм не найдено ни одного документа. Так почему же он не добавит мне NULL к этой одной позиции и выведет 38 записей.
В чём я ошибся? Спасибо.
7 дек 09, 10:17    [8026660]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
В чём я ошибся?

 inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) 
7 дек 09, 10:19    [8026669]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31240
RSRuslan
В чём я ошибся? Спасибо.
Вы ошиблись в выборе стиля написания текста запроса и сами не видите, что у вас там добавился inner join.

Оператор объединения лучьше писать слева.

select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI  
	inner join _1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014'))  
	left join _1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) 
	left join _1scrdoc as Графы ON ((Графы.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (Графы.MDID='6034')) 
	inner join DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP6570 > AI.SP6572) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)
7 дек 09, 10:22    [8026684]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
ветерочек
В чём я ошибся?

 inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) 


Даже если здесь ставить left join - то уже будет возвращено около 2000 записей. Это не годится :(
7 дек 09, 10:55    [8026940]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
alexeyvg
RSRuslan
В чём я ошибся? Спасибо.
Вы ошиблись в выборе стиля написания текста запроса и сами не видите, что у вас там добавился inner join.

Оператор объединения лучьше писать слева.

select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI  
	inner join _1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014'))  
	left join _1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) 
	left join _1scrdoc as Графы ON ((Графы.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (Графы.MDID='6034')) 
	inner join DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP6570 > AI.SP6572) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)


Если вы имеете ввиду "inner join DT4738 as Заказы....", то если поставить "left join" будет возвращено порядка 2000 записей, но ни как не 38 :(
7 дек 09, 10:57    [8026950]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
RSRuslan
уже будет возвращено около 2000 записей. Это не годится :(
Вы определяете правильность запроса по количеству возвращаемых им записей?
Странно...
А может, лучше разобраться, почему в результат попали записи, которые не должны были туда попасть?
7 дек 09, 10:59    [8026967]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
Даже если так, то всё равно не то:
select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) left join
	_1scrdoc as Графы ON (Графы.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') left join 
	DT4738 as Заказы on (Графы.CHILDID = Заказы.IDDOC)

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL) and 
	(Графы.MDID='6034') and (Заказы.SP6570 > AI.SP6572) and
	(Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   '))
7 дек 09, 11:05    [8027021]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31240
RSRuslan
Если вы имеете ввиду "inner join DT4738 as Заказы....", то если поставить "left join" будет возвращено порядка 2000 записей, но ни как не 38 :(
Ну да, я и говорю, что тогда получится тот результат, который вам нужен.

Вы ведь хотите получить все заказы для выбранных документов? Их будет как раз 2000.

А если вам не это нужно, тогда составьте правильный запрос.
7 дек 09, 11:08    [8027045]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
RSRuslan
Даже если так...
условия, накладываемые на таблицы,
которые присоединены по LEFT JOIN,
должны быть не во WHERE, а в ON

за исключением проверок на NULL
7 дек 09, 11:09    [8027053]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Паганель
RSRuslan
Даже если так...
условия, накладываемые на таблицы,
которые присоединены по LEFT JOIN,
должны быть не во WHERE, а в ON

за исключением проверок на NULL
Я бы добавил: и не в ON INNER JOINа какого-нибудь.
Ибо это убъёт все NULLы, порождённые LEFT JOINом
Например,
... Графы INNER JOIN Заказы ... ON ...
выглядит очень подозрительно.
7 дек 09, 11:21    [8027153]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
Смотрите, вот что возвращает этот запрос:
select 	distinct AI.ID as АрИм

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015'))

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)

Возвращает вот это:
U8
U9
UA
UC
UH
UI
UJ
UK
UL
UM
UN
UO
UP
UQ
US
UT
569
5GS
5KJ
63P
67S
C3X
GAO
GP5
GP6
GP7
GP8
I1A
LBD
M1E
RAC
RXT
URN
14A0
18WS
1K9K
1LSU
1QMK

38 записей

А вот этот запрос:
use SrvKlnt
select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) left join
	_1scrdoc as Графы ON ((Графы.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (Графы.MDID='6034')) inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP6570 > AI.SP6572) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)

Возвращает вот это:
U8 2PYTV
U9 2PYTV
UA 2PYTV
UC 2PYTV
UH 2PYTV
UI 2PYTV
UJ 2PYTV
UK 2PYTV
UL 2PYTV
UM 2PYTV
UN 2PYTV
UO 2PYTV
UP 2PYTV
UQ 2PYTV
US 2PYTV
UT 2PYTV
569 2PYTV
5GS 2PYTV
5KJ 2PYTV
63P 2PYTV
67S 2PYTV
C3X 2PYTV
GAO 2PYTV
GP5 2PYTV
GP6 2PYTV
GP7 2PYTV
GP8 2PYTV
I1A 2PYTV
LBD 2PYTV
M1E 2PYTV
RAC 2PYTV
RXT 2PYTV
URN 2PYTV
14A0 2PYTV
18WS 2PYTV
1K9K 2PYTV
1LSU 2PYTV

37 записей

Так вот, то что возвращают оба запроса - это правильные данные, именно то, что нужно. Но вот как сделать так, чтобы во втором запросе было 38 записей, именно той одной которой нету документов было приписано NULL. Пока никак не получается сделать.
Выручайте!
7 дек 09, 11:39    [8027342]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
aleks2
Guest
Что-то в духе

select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) 
left join
(select * 
FROM
	_1scrdoc as Графы inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP6570 > AI.SP6572) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))
) X
ON ((X.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (X.MDID='6034')) 

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)
7 дек 09, 11:47    [8027445]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
aleks2
Что-то в духе

select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) 
left join
(select * 
FROM
	_1scrdoc as Графы inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP6570 > AI.SP6572) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))
) X
ON ((X.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (X.MDID='6034')) 

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)


Server: Msg 107, Level 16, State 2, Line 2
The column prefix 'Графы' does not match with a table name or alias name used in the query.
Server: Msg 107, Level 16, State 1, Line 2
The column prefix 'AI' does not match with a table name or alias name used in the query.

:(
7 дек 09, 11:57    [8027574]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
aleks2
Guest
RSRuslan
aleks2
Что-то в духе

select 	distinct AI.ID as АрИм,
	Графы.CHILDID as Документ

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) 
left join
(select * 
FROM
	_1scrdoc as Графы inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP6570 > AI.SP6572) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))
) X
ON ((X.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (X.MDID='6034')) 

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)


Server: Msg 107, Level 16, State 2, Line 2
The column prefix 'Графы' does not match with a table name or alias name used in the query.
Server: Msg 107, Level 16, State 1, Line 2
The column prefix 'AI' does not match with a table name or alias name used in the query.

:(


Я за тебя и зарплату должен получать?
7 дек 09, 12:14    [8027746]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
aleks2

Я за тебя и зарплату должен получать?


Да ладно тебе. Я такую конструкцию первый раз вижу и вот и не могу пока понять где какие должны быть алиасы. Не хочешь не помагай :)
7 дек 09, 12:20    [8027812]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
aleks2
Guest
RSRuslan
aleks2

Я за тебя и зарплату должен получать?


Да ладно тебе. Я такую конструкцию первый раз вижу и вот и не могу пока понять где какие должны быть алиасы. Не хочешь не помагай :)


Ну дык просветись: DERIVED TABLE

select 	distinct AI.ID as АрИм,
	X.CHILDID as Документ

from 	sc4373 as AI inner join 
	_1SCONST as Per ON ((AI.ID = Per.OBJID) and  (Per.ID = '6014')) left join 
	_1SCONST as Per2 ON ((AI.ID = Per2.OBJID) and  (Per2.ID = '6015')) 
left join
(select * 
FROM
	_1scrdoc as Графы inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))
) X
ON ((X.PARENTVAL = 'B1 3DH' + rtrim(AI.ID) + '           ') and (X.MDID='6034')) 
and (X.SP6570 > AI.SP6572) 

where 	(AI.parentext = '    LT   ') and (Per2.VALUE is NULL)

Только в подзапросе
select * 
FROM
	_1scrdoc as Графы inner join 
	DT4738 as Заказы on ((Графы.CHILDID = Заказы.IDDOC) and (Заказы.SP5789 is not null) and ((Заказы.SP5777 = '   49K   ') or (Заказы.SP5777 = '   4UI   ')))
Должно получаться что-то вменяемое... т.е. "разумное количество и качество" строк.
7 дек 09, 12:32    [8027928]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
RSRuslan
Member

Откуда: Киев
Сообщений: 173
aleks2


Спасибо большое!!!! Вот это как раз то, что нужно было.
Как программист, я интуитивно понимаю, что если уже удалось написать то, что я изложил в своём первом посте (а написал я это самостоятельно, не прибегая к услугам форума), то уже такую мелочь как моя проблема с присоединением NULL записей вообще выеденного яйца не стоит. Но... Как полез решать, то увы, упёрся... К сожалению практического опыта ещё пока очень мало.
7 дек 09, 12:44    [8028040]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с left join  [new]
Kipchak2
Member

Откуда: Казахстан, г. Алматы
Сообщений: 12
RSRuslan,

мне кажется конструкция запроса не верная. Раздел JOIN используется для связывания данных двух таблиц между собой. А условие (Per.ID = '6014') должно быть вынесено в раздел WHERE...
7 дек 09, 13:32    [8028439]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить