Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Left join "шапки" и "табличной части" документа (число прочтений - 3155 )
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Left join "шапки" и "табличной части" документа
08. Февраля 2010 :: 09:33
Печать  
Я понимаю что это не совсем сюда, скорее вcего это элементарные знания SQL ..... но у меня уже крыша едет!
Есть простейший запрос
Код
Выбрать все
select dh.sp1012 from dh1011 as dh
left join dt1011 as dt on dh.iddoc = dt.iddoc
where dh.iddoc = '  P4ZJKRC' 


Сколько он должен вернуть строк?! По моему мнению одну, т.к. в dh есть только одна запись по документу. Но он упорно возвращает 12 записей, т.е. столько, сколько строк у документа? С какого перепугу?!!!! Все учебники по SQL гласят что LEFT JOIN должен вернуть столько записей, сколько их в "левой" таблице. Или я неправильно эти учебники читал?! Но чем тогда отличаются LEFT, RIGHT, INNER, и FULL. В данном примере ВСЕ ОНИ ВОЗВРАЩАЮТ 12 ЗАПИСЕЙ! Это переворачивает с ног на голову все мои небогатые знания SQL.
Помогите pls, объаяните где я дурак, а то уже "кипит мой разум возмущенный...."  и скоро крышу нах сорвет Плачущий
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Left join "шапки" и "табличной части" документа
Ответ #1 - 08. Февраля 2010 :: 09:45
Печать  
И какую из 12-ти строк по-твоему должен вернуть запрос?
Если хочешь именно одну строку, то дописывай "TOP 1" или группируй
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Left join "шапки" и "табличной части" документа
Ответ #2 - 08. Февраля 2010 :: 09:50
Печать  
У тебя же левое соеденнние шапки документа с многострочной частью
Если нет многострочной части то вернет одну строку
иначе будет столько строк сколько в многострочной части документа.

PS Если тебе нужна только строка по шапке документа надо написать так

select dh.sp1012 from dh1011 as dh
where dh.iddoc = '  P4ZJKRC'
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Left join "шапки" и "табличной части" документа
Ответ #3 - 08. Февраля 2010 :: 09:54
Печать  
avgreen писал(а) 08. Февраля 2010 :: 09:33:
Я понимаю что это не совсем сюда, скорее вcего это элементарные знания SQL ..... но у меня уже крыша едет!
Есть простейший запрос
Код
Выбрать все
select dh.sp1012 from dh1011 as dh
left join dt1011 as dt on dh.iddoc = dt.iddoc
where dh.iddoc = '  P4ZJKRC' 


Сколько он должен вернуть строк?! По моему мнению одну, т.к. в dh есть только одна запись по документу. Но он упорно возвращает 12 записей, т.е. столько, сколько строк у документа? С какого перепугу?!!!! Все учебники по SQL гласят что LEFT JOIN должен вернуть столько записей, сколько их в "левой" таблице. Или я неправильно эти учебники читал?! Но чем тогда отличаются LEFT, RIGHT, INNER, и FULL. В данном примере ВСЕ ОНИ ВОЗВРАЩАЮТ 12 ЗАПИСЕЙ! Это переворачивает с ног на голову все мои небогатые знания SQL.
Помогите pls, объаяните где я дурак, а то уже "кипит мой разум возмущенный...."  и скоро крышу нах сорвет Плачущий


Неправильно читал. К примеру левое соединение вернет количество, равное количеству строк левой таблицы только в том случае, если в той таблице, с которой идет соединение, не будет совпадений.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Left join "шапки" и "табличной части" документа
Ответ #4 - 08. Февраля 2010 :: 10:01
Печать  
Leierkastenmann писал(а) 08. Февраля 2010 :: 09:54:
avgreen писал(а) 08. Февраля 2010 :: 09:33:
Я понимаю что это не совсем сюда, скорее вcего это элементарные знания SQL ..... но у меня уже крыша едет!
Есть простейший запрос
Код
Выбрать все
select dh.sp1012 from dh1011 as dh
left join dt1011 as dt on dh.iddoc = dt.iddoc
where dh.iddoc = '  P4ZJKRC' 


Сколько он должен вернуть строк?! По моему мнению одну, т.к. в dh есть только одна запись по документу. Но он упорно возвращает 12 записей, т.е. столько, сколько строк у документа? С какого перепугу?!!!! Все учебники по SQL гласят что LEFT JOIN должен вернуть столько записей, сколько их в "левой" таблице. Или я неправильно эти учебники читал?! Но чем тогда отличаются LEFT, RIGHT, INNER, и FULL. В данном примере ВСЕ ОНИ ВОЗВРАЩАЮТ 12 ЗАПИСЕЙ! Это переворачивает с ног на голову все мои небогатые знания SQL.
Помогите pls, объаяните где я дурак, а то уже "кипит мой разум возмущенный...."  и скоро крышу нах сорвет Плачущий


Неправильно читал. К примеру левое соединение вернет количество, равное количеству строк левой таблицы только в том случае, если в той таблице, с которой идет соединение, не будет совпадений.

Вот именно
может быть два случая
1.в dt.iddoc  нет равной '  P4ZJKRC'. Т.е у документа нет многострочной части
Тогда вернем одну строку так как нет совпадений с dt
2.в  dt.iddoc  12 записей где '  P4ZJKRC'.
Т.е у документа 12 строк в т многострочной части.
Тогда вернем 12 строк по одной строке на каждое совпадение
dр.iddoc = dt.iddoc.

  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Left join "шапки" и "табличной части" документа
Ответ #5 - 08. Февраля 2010 :: 12:31
Печать  
Спасибо за разъяснение!
Блин, как трудно быть по пояс деревянным, особенно сверху Печаль  Плачущий
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Left join "шапки" и "табличной части" документа
Ответ #6 - 08. Февраля 2010 :: 15:46
Печать  
в картинках, как-то так:
ЗЫ: ну не художник я Печаль


« Последняя редакция: 09. Февраля 2010 :: 12:39 - Eprst »  

Join.jpg ( 67 KB | Загрузки )
Join.jpg
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Left join "шапки" и "табличной части" документа
Ответ #7 - 08. Февраля 2010 :: 18:28
Печать  
Пытался нарисовать left semi join. Сломал фломастер. Смех А вот картинка full outer join на фоне union all смотрится хорошо. Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Left join "шапки" и "табличной части" документа
Ответ #8 - 09. Февраля 2010 :: 06:47
Печать  
Ну это то да..
Не обязательно же джойнить.. можно и подзапросом получить..или еще как
Улыбка
  
Наверх
 
IP записан
 
Захар Малиновский
Junior Member
**
Отсутствует


1C++ active user

Сообщений: 53
Местоположение: г. Харьков
Зарегистрирован: 26. Февраля 2009
Re: Left join "шапки" и "табличной части" документа
Ответ #9 - 09. Февраля 2010 :: 07:19
Печать  
А-аааа. Чуть не испугался посмотрев на картинки.

Все таки мир остаётся на  месте. LEFT JOiN и LEFT OUTER JOIN это в ms-sql одно и тоже.
Специально проверил.
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Left join "шапки" и "табличной части" документа
Ответ #10 - 09. Февраля 2010 :: 12:41
Печать  
Захар Малиновский писал(а) 09. Февраля 2010 :: 07:19:
А-аааа. Чуть не испугался посмотрев на картинки.


Ну звиняйте..затупил мальца..
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать