Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Тупо не понимаю как работает JOIN (1sqlite) (число прочтений - 4944 )
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Тупо не понимаю как работает JOIN (1sqlite)
27. Августа 2010 :: 06:56
Печать  
Справочник Спр0 - владелец справочников Спр1, Спр2 и Спр3.
Надо "сплясав" от справочника Спр1 ("подтянув" к нему владельца - это в принципе лирика но на всякий случай привожу ситуацию полностью) выдрать из справочников Спр2 и Спр3 элементы того же владельца и с кодами, совпадающими с кодами Спр1 (если они есть) или пустоту (если таких элементов нету). Т.е., используя последовательно LEFT JOIN ("при котором все записи из первой (левой) таблицы включаются в динамический набор, даже если во второй (правой) таблице нет соответствующих им записей.") хочу получить набор записей:
- Эл1по всем элементам справочника Спр1
- Эл2по найденным элементам справочника Спр2 / пустопо не(!)найденным элементам справочника Спр2
- Эл3по найденным элементам справочника Спр3 / пустопо не(!)найденным элементам справочника Спр3

Тупо пытаюсь выдрать последовательными LEFT JOIN.

1.Вот это:
Код
Выбрать все
|SELECT
|	Спр0.id [Эл0 :Справочник.<Спр0вид>], Спр0.code as Спр0код, Спр0.Рекв as Спр0рекв, Спр1.id [Эл1 :Справочник.<Спр1вид>]
|	, Спр2.id [Эл2: Справочник.<Спр2вид>]
|	, Спр3.id [Эл2: Справочник.<Спр3вид>]
|FROM [Справочник.<Спр1вид>] as Спр1 LEFT JOIN [Справочник.<Спр0вид>] as Спр0 ON Спр0.id = Спр1.parentext
|	LEFT JOIN [Справочник.<Спр2вид>] as Спр2 ON Спр2.parentext = Спр0.id AND Спр2.code = Спр1.code
|	LEFT JOIN [Справочник.<Спр3вид>] as Спр3 ON Спр3.parentext = Спр0.id AND Спр3.code = Спр1.code
|WHERE Спр0.ismark <> '*'
|	AND Спр1.ismark <> '*'
|	AND Спр2.ismark <> '*'
|	AND Спр3.ismark <> '*'
|	AND Спр0.Рекв < 3
 

=== выдает  записи только строго с найденными (одновременно!) элементами Спр2 и Спр3. При этом в справочнике Спр3 меньше кодов чем с Спр2 (и Спр1 если это важно!), но строк с найденными элементами Спр1 и Спр2 но с ненайденными Спр3 - нету.
Что я делаю не так и как сделать так?

ЗЫ: и не бейте ногами, да, я ламер в t-sql, я в курсе что мануалы надо ковырять - я ковырял но не помогло. Нерешительный
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #1 - 27. Августа 2010 :: 07:08
Печать  
ага, вот это вот зачет условие для соедиения:

ON Спр2.parentext = Спр0.id AND Спр2.code = Спр1.code
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #2 - 27. Августа 2010 :: 07:13
Печать  
Eprst писал(а) 27. Августа 2010 :: 07:08:
ага, вот это вот зачет условие для соедиения:

ON Спр2.parentext = Спр0.id AND Спр2.code = Спр1.code

что не так то? условие для связи с более "левой" выборкой (Спр0+Спр1) с условием совпадения владельца с текущим элементом Спр0 и совпадения кода с кодом Спр1. или ты о чём?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #3 - 27. Августа 2010 :: 07:27
Печать  
вот так поменяй попробуй:
Код
Выбрать все
|	LEFT JOIN [Справочник.<Спр2вид>] as Спр2 ON Спр2.parentext = Спр1.parentext AND Спр2.code = Спр1.code
|	LEFT JOIN [Справочник.<Спр3вид>] as Спр3 ON Спр3.parentext = Спр1.parentext AND Спр3.code = Спр1.code 


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


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #4 - 27. Августа 2010 :: 07:55
Печать  
Eprst писал(а) 27. Августа 2010 :: 07:27:
вот так поменяй попробуй: ...

не помогает. точно так же возвращает набор, в во всех колонках которого элементы строго наличествуют.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #5 - 27. Августа 2010 :: 07:57
Печать  
А что не устраивает в результирующем наборе ?
Ты же соединяешь Спр2 и Спр3 по жестко заданным условиям на код элемента.
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #6 - 27. Августа 2010 :: 08:06
Печать  
Eprst писал(а) 27. Августа 2010 :: 07:57:
А что не устраивает в результирующем наборе ?
Ты же соединяешь Спр2 и Спр3 по жестко заданным условиям на код элемента.

Cthulhu писал(а) 27. Августа 2010 :: 06:56:
... Надо "сплясав" от справочника Спр1 ... выдрать из справочников Спр2 и Спр3 элементы того же владельца и с кодами, совпадающими с кодами Спр1 (если они есть) или пустоту (если таких элементов нету). Т.е., используя последовательно LEFT JOIN ("при котором все записи из первой (левой) таблицы включаются в динамический набор, даже если во второй (правой) таблице нет соответствующих им записей.") хочу получить набор записей ...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #7 - 27. Августа 2010 :: 08:15
Печать  
Ну, тогда тупо не ставь условие на код справочника в соединении, поимеешь
все элементы Спр2 и Спр3...
и в селект
Код
Выбрать все
|--, Спр2.id [Эл2: Справочник.<Спр2вид>]
|,case when  Спр2.code = Спр1.code then Спр2.id else $ПустойИД end [Эл2: Справочник.<Спр2вид>] 



если я тебя правильно понял про "пустоту" , если нет с таким кодом.
ЗЫ: а так, строки из правой присоединенной таблички попадут в результирующий набор, только если они попадают под условие соединения и фильтр в ветке where
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #8 - 27. Августа 2010 :: 08:23
Печать  
Eprst писал(а) 27. Августа 2010 :: 08:15:
Ну, тогда тупо не ставь условие на код справочника в соединении, поимеешь
все элементы Спр2 и Спр3...
и в селект
Код
Выбрать все
|--, Спр2.id [Эл2: Справочник.<Спр2вид>]
|,case when  Спр2.code = Спр1.code then Спр2.id else $ПустойИД end [Эл2: Справочник.<Спр2вид>] 



если я тебя правильно понял про "пустоту" , если нет с таким кодом.

Но мне ВАЖНО соответствие кодов, и в каждой записи должен быть приджойнен или элемент с таким же кодом и владельцем, или пустота (но запись в результирующем наборе должна быть в любом случае!).
или я неверно понял дважды процитированную фразу из описания LEFT JOIN????

Вот даже ворт такой тупой код:
Код
Выбрать все
|SELECT
|	Спр1.parentext [Эл0 :Справочник.<Спр0вид>]
|	Спр1.id [Эл1 :Справочник.<Спр1вид>]
|	, Спр3.id [Эл2: Справочник.<Спр3вид>]
|FROM [Справочник.<Спр1вид>] as Спр1
|	LEFT JOIN [Справочник.<Спр3вид>] as Спр3
|		ON Спр3.parentext = Спр1.parentext AND Спр3.code = Спр1.code
|WHERE
|	AND Спр1.ismark <> '*'
|	AND Спр3.ismark <> '*' 


== для имеющихся 15-ти элементов справочника Спр1 из которых только для одного есть соответствующий ему (по владельцу и по коду - т.е. именно по условию, которое упомянуто в процитированном описании LEFT JOIN) возвращает единственную запись с непустым элементом справочника Спр3
я в полных непонятках...  Плачущий

Добавлено: ну хренсним, чтобы посмотреть - попробовал как ты говоришь, результат: no such column: $ПустойИД!..
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #9 - 27. Августа 2010 :: 08:37
Печать  
Ну смотри, у тебя есть табличка вида

спр1:

id    code  name
1      10     Иванов
2      20     Петров
3      30     Сидоров

спр2:

id    code  name
1      40     Вася
2      20     Федя
3      99     Веня
3      10     Стасик
3      20     Славик

когда ты делаешь такой запрос
select
   спр1.name Фамилия
   ,спр2.name  Имя
from спр1
left join спр2 on спр2.id = спр1.id

то на выходе будет табличка
Фамилия    Имя
Иванов      Вася
Петров      Федя
Сидоров   Веня
Сидоров   Стасик
Сидоров   Славик

если ты вот такое условие воткнешь еще
  left join спр2 on спр2.id = спр1.id and спр2.code = спр1.code
то на выходе:

Фамилия    Имя
Иванов      
Петров      Федя
Сидоров  


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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #10 - 27. Августа 2010 :: 08:38
Печать  
на  :ПустойИД замени.

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


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #11 - 27. Августа 2010 :: 08:42
Печать  
Eprst писал(а) 27. Августа 2010 :: 08:37:
Ну смотри, у тебя есть табличка вида

спр1:

id    code  name
1      10     Иванов
2      20     Петров
3      30     Сидоров

спр2:

id    code  name
1      40     Вася
2      20     Федя
3      99     Веня
4      10     Стасик

когда ты делаешь такой запрос
select
   спр1.name Фамилия
   ,спр2.name  Имя
from спр1
left join спр2 on спр2.id = спр1.id

дальше не в ту сторону ...

Смотри.

спр1:
id    code  name
1      10     Иванов
2      20     Петров
3      30     Сидоров
5      50     Назаборногузадерищенко

спр2:
id    code  name
1      40     Вася
2      20     Федя
3      99     Веня
4      10     Стасик

от запроса:
select  спр1.name Фамилия, спр2.name  Имя
from спр1 left join спр2 on спр2.id = спр1.id

хочу:
Фамилия    Имя
Иванов      Вася
Петров      Федя
Сидоров   Веня
Назаборногузадерищенко

не то хочу????
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #12 - 27. Августа 2010 :: 08:44
Печать  
у тебя так и будет.. я поправил пример - сделав побольше одинаковых id для понимания процесса Улыбка
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #13 - 27. Августа 2010 :: 08:48
Печать  
Eprst писал(а) 27. Августа 2010 :: 08:44:
у тебя так и будет.. я поправил пример - сделав побольше одинаковых id для понимания процесса Улыбка

у меня НЕ так получается (отличие от твоего только в том, что условие составное через AND - и ##па, выдает только одну запись с непустым значением LEFT-при-JOIN-ненной таблицы игнорируя все записи для которых по условию соответствия в ней не найдено)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #14 - 27. Августа 2010 :: 08:53
Печать  
ты вот это дочитал ?

Цитата:
если ты вот такое условие воткнешь еще
  left join спр2 on спр2.id = спр1.id and спр2.code = спр1.code
то на выходе:

Фамилия    Имя
Иванов      
Петров      Федя
Сидоров   
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать