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

Откуда:
Сообщений: 20504
Ребят, чего-то туплю. В MS SQL 2008 можно ли использовать JOIN и WHERE в одном запросе?
В 2000-м вроде прокатывало, а тут вот:
SELECT DSR.*, D.*, O.NameObjectNPO FROM DocShiftReport AS DSR, [Document] AS D 
LEFT JOIN ObjectNPO AS O ON DSR.IdObjectNPO = O.IdObjectNPO
WHERE (D.IdDoc = DSR.IdDocShiftReport)

Ругается таким образом: Msg 4104, Level 16, State 1, Line 2
The multi-part identifier "DSR.IdObjectNPO" could not be bound.
2 май 12, 12:00    [12494724]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
правильно ругается
Нечего мешать разные стили JOIN-ов
2 май 12, 12:02    [12494734]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Вот так работает:
SELECT DSR.*, D.*, O.NameObjectNPO FROM DocShiftReport AS DSR
INNER JOIN [Document] AS D ON (D.IdDoc = DSR.IdDocShiftReport)
LEFT JOIN ObjectNPO AS O ON DSR.IdObjectNPO = O.IdObjectNPO

но хотелось бы по-старинке, через WHERE
2 май 12, 12:03    [12494736]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory
правильно ругается
Нечего мешать разные стили JOIN-ов

Сиквел теперь борется за эстетику?
2 май 12, 12:04    [12494746]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Сиквел теперь борется за эстетику?

Тогда используйте везде одинаковый стиль join-ов
2 май 12, 12:05    [12494753]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
iljy
Member

Откуда:
Сообщений: 8711
defragmentator
Glory
правильно ругается
Нечего мешать разные стили JOIN-ов

Сиквел теперь борется за эстетику?

Нет, всего лишь за грамотность. Помимо вашего мощного воображения сущаствует еще такая примитивная банальщина, как приоритет операций
2 май 12, 12:22    [12494858]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
iljy
Помимо вашего мощного воображения сущаствует еще такая примитивная банальщина, как приоритет операций

Грамотность - это одно, а приоритет операций - совсем другое.
Если одно с другим несовместимо, в BOL должно быть явно это указано.
2 май 12, 12:29    [12494913]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Если одно с другим несовместимо, в BOL должно быть явно это указано.

Таки и указано

Inner joins can be specified in either the FROM or WHERE clauses. Outer joins can be specified in the FROM clause only. The join conditions combine with the WHERE and HAVING search conditions to control the rows that are selected from the base tables referenced in the FROM clause.

Specifying the join conditions in the FROM clause helps separate them from any other search conditions that may be specified in a WHERE clause, and is the recommended method for specifying joins.
2 май 12, 12:45    [12494978]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
defragmentator
iljy
Помимо вашего мощного воображения сущаствует еще такая примитивная банальщина, как приоритет операций

Грамотность - это одно, а приоритет операций - совсем другое.
Если одно с другим несовместимо, в BOL должно быть явно это указано.
Поля таблиц, перечисленных через запятую во FROMе,
связываются между собой в WHERE.
А Вы пытаетесь сделать это во FROMе.
Где же здесь элементарная логика?
2 май 12, 12:49    [12495001]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
iljy
Member

Откуда:
Сообщений: 8711
defragmentator
iljy
Помимо вашего мощного воображения сущаствует еще такая примитивная банальщина, как приоритет операций

Грамотность - это одно, а приоритет операций - совсем другое.
Если одно с другим несовместимо, в BOL должно быть явно это указано.

Все прекрасно совместимо, просто совмещать надо с умом, а лучше все-таки не совмещать, не для того оно сделано.
declare @t1 table (id int)
declare @t2 table (id int)
declare @t3 table (id int)

select * from @t1 t1, @t2 t2 join @t3 t3 on t2.id = t3.id
where t1.id = t2.id
2 май 12, 12:56    [12495044]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iljy
defragmentator
пропущено...

Грамотность - это одно, а приоритет операций - совсем другое.
Если одно с другим несовместимо, в BOL должно быть явно это указано.

Все прекрасно совместимо, просто совмещать надо с умом, а лучше все-таки не совмещать, не для того оно сделано.
declare @t1 table (id int)
declare @t2 table (id int)
declare @t3 table (id int)

select * from @t1 t1, @t2 t2 join @t3 t3 on t2.id = t3.id
where t1.id = t2.id
Просто результаты JOINов между соседними запятыми во FROMе надо рассматривать как некие "виртуалные таблицы".
А дальше работает синтаксис перечисления таблиц во FROMе через запятую (связка между ними тогда возможна только в WHERE).
2 май 12, 13:01    [12495075]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Ребята, большое спасибо, конечно, всё очень умно, но не совсем в тему.
Нашёл, где ступил. Правильно так:
SELECT DSR.*, D.*, O.NameObjectNPO FROM DocShiftReport AS DSR
LEFT JOIN ObjectNPO AS O ON DSR.IdObjectNPO = O.IdObjectNPO, 
[Document] AS D 
WHERE (D.IdDoc = DSR.IdDocShiftReport)


Таблица DSR связывается с таблицей O и это надо указывать явно.

Так что мешать разные стили можно:-)
2 май 12, 13:28    [12495228]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
iljy,
спасибо, Ваш пример помог исправить свою ошибку.
2 май 12, 13:31    [12495257]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
iljy
Member

Откуда:
Сообщений: 8711
Мда, не надо было мне пример показывать... Глядишь поверил бы человек, что нельзя, и стал бы писать по человечески, а теперь будет сам же себе грабли раскладывать.
2 май 12, 13:44    [12495351]     Ответить | Цитировать Сообщить модератору
 Re: Соединения JOIN и WHERE в одном запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
iljy
Мда, не надо было мне пример показывать... Глядишь поверил бы человек, что нельзя, и стал бы писать по человечески, а теперь будет сам же себе грабли раскладывать.
Ну, иногда граблетерапия дает хороший лечебный эффект :)
2 май 12, 14:20    [12495674]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить