Я не использую синтаксис USING, так как
- большинство моих соединений не подходят для этого (не то же имя поля, которое сопоставляется, и/или несколько совпадений в объединении) и
- не сразу очевидно, во что это переводится в случае с более чем двумя таблицами
т.е. предполагая 3 таблицы со столбцами «id» и «id_2», делает
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)
стать
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)
or
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)
или что-то еще?
Выяснение этого для конкретной версии базы данных является довольно тривиальным упражнением, но я не очень уверен, что это согласовано во всех базах данных, и я не единственный человек, который должен поддерживать мой код (поэтому другие люди также должны будут знать, что это эквивалентно).
Очевидная разница между WHERE и ON заключается в том, что соединение является внешним:
Предполагая T1 с одним полем идентификатора, одной строкой, содержащей значение 1, и T2 с идентификатором и полем VALUE (одна строка, ID = 1, VALUE = 6), мы получаем:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42
не дает строк, так как WHERE требуется для совпадения, тогда как
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)
даст одну строку со значениями
1, NULL, NULL
поскольку ON требуется только для сопоставления соединения, которое является необязательным из-за того, что оно внешнее.
person
Cebjyre
schedule
16.12.2008