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


1C++ rocks!

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

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

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

Дочитал и ответил - у меня при использовании составного условия (по равенству code и по равенству parentext) выдается (в контексте твоего примера) только набор:
Фамилия    Имя
Петров      Федя
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #16 - 27. Августа 2010 :: 09:23
Печать  
Cthulhu писал(а) 27. Августа 2010 :: 08:23:
Вот даже ворт такой тупой код:
Код
Выбрать все
|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

Для остальных 14 записей Спр3.ismark есть null, значит и результат условия Спр3.ismark <> '*' есть null, а null не есть истина, по-этому записи отбрасываются, как не соответствующие условию.
Нужно или перенести это условие в секцию FROM или дополнить условие соответствующим образом.
  

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


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #17 - 27. Августа 2010 :: 09:30
Печать  
И ещё. Конструкция с выкидыванием из условия равенства кодов и с CASE в колонке на двух таблицах дает что надо.
НО! Мне-то нужен набор записей [спр1] - [спр2/пусто] - [спр3/пусто] - [спр4/пусто], построенный по условию совпадения владельца+кода слева-направо, а использование выкидывания из условия равенства кодов и с CASE в колонке выдает дикое количество записей со всеми(!) возможными(!) сочетаниями элементов подчиненных одному владельцу...
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #18 - 27. Августа 2010 :: 09:33
Печать  
berezdetsky писал(а) 27. Августа 2010 :: 09:23:
... Для остальных 14 записей Спр3.ismark есть null, значит и результат условия Спр3.ismark <> '*' есть null, а null не есть истина, по-этому записи отбрасываются, как не соответствующие условию.
Нужно или перенести это условие в секцию FROM или дополнить условие соответствующим образом.

Ох, да! ну я тупой. пойду дальше думать...

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



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

___________003.ert ( 28 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



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


в условие присоединения воткни это условие..
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #21 - 27. Августа 2010 :: 09:45
Печать  
Cthulhu писал(а) 27. Августа 2010 :: 09:33:
добавлено: чот не придумывается - как его "перенести" или "дополнить"...  Нерешительный

Перенести:
Код
Выбрать все
|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 AND Спр3.ismark <> '*'
|WHERE
|	AND Спр1.ismark <> '*' 


С дополнить сложнее - я 1sqlite не знаю  Нерешительный На T-SQL это было бы что-то типа

IsNull(Спр3.ismark, '') <> '*'

Тут нужно заменить IsNull на 1sqlite-ный аналог.
  

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


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #22 - 27. Августа 2010 :: 10:15
Печать  
Eprst писал(а) 27. Августа 2010 :: 09:40:
Cthulhu писал(а) 27. Августа 2010 :: 09:33:
добавлено: чот не придумывается - как его "перенести" или "дополнить"...  Нерешительный

в условие присоединения воткни это условие..

Да, я немного ещё подумал - и догадался тоже - в WHERE оставляю только условие по ismark на Спр1, а во все джойны добавляю условие AND Спрi.ismark = Спр1.ismark
уцепил четіре справочника в цепочку джойнов - пашет. Улыбка
ща ещё на периодический реквизит Спр0 (самого начального варианта) буду думать как аналогично подцепить джойнами два подчиненных справочника таким же макаром.

ЗЫ: а там ещё будет вопрос с джойном по максимальному не превышающему коду... ещё поспрашиваю!.. Улыбка

ЗЗЫ: berezdetsky, BgInfo-й положил на раб.стол "WHERE накладывается на сформированный набор записей а не на этапе его составления!!!", спасибо тебе!
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #23 - 27. Августа 2010 :: 20:54
Печать  
Код
Выбрать все
SELECT TOP 1 ... 


а такое в 1sqlite не пашет?..
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #24 - 28. Августа 2010 :: 05:58
Печать  
В конце запроса допиши
LIMIT 1
  
Наверх
ICQ  
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #25 - 28. Августа 2010 :: 08:06
Печать  
Salimbek писал(а) 28. Августа 2010 :: 05:58:
В конце запроса допиши
LIMIT 1

Так и делаю, спасибо.
Но. Я 1sqlite(прямые запросы) юзаю для ускорения. А LIMIT накладывается вроде на сформированный набор записей? Или все-таки используется в процессе формирования набора записей? Если на результат - то это только "бантик", который ничего не ускорит (то же самое будет если без него и потом юзать только первую строку результата запроса).
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #26 - 28. Августа 2010 :: 09:13
Печать  
Cthulhu писал(а) 28. Августа 2010 :: 08:06:
Так и делаю, спасибо.
Но. Я 1sqlite(прямые запросы) юзаю для ускорения. А LIMIT накладывается вроде на сформированный набор записей? Или все-таки используется в процессе формирования набора записей? Если на результат - то это только "бантик", который ничего не ускорит (то же самое будет если без него и потом юзать только первую строку результата запроса).

А ты думаешь Top 1 в MSSQL как-то по другому работает?
  
Наверх
ICQ  
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: Тупо не понимаю как работает JOIN (1sqlite)
Ответ #27 - 28. Августа 2010 :: 09:51
Печать  
Salimbek писал(а) 28. Августа 2010 :: 09:13:
А ты думаешь Top 1 в MSSQL как-то по другому работает?

Думаю, да.
При том, что обе конструкции есть в t-sql и про limit гугль выдает ссылки на нечто вроде предостережений (в частности при его использовании с rand()).
Но это лишь мои предположения - не более. Интересно было бы выслушать мнение тех, кто разбирается в вопросе лучше меня.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать