Итак, я изучаю SQL (sqlite flavour) и просматриваю документацию sqlite JOIN-предложения , я считаю, что эти два утверждения действительны:
SELECT *
FROM table1
JOIN (table2, table3) USING (id);
SELECT *
FROM table1
JOIN table2 USING (id)
JOIN table3 USING (id)
(или даже, но это не относится к делу:
SELECT *
FROM table1
JOIN (table 2 JOIN table3 USING id) USING id
)
Теперь я видел второе (цепное соединение) много в SO вопросах по JOIN
предложениям , но редко первый (сгруппированная таблица-запрос). Оба запроса выполняются в SQLiteStudio для неупрощенного случая.
Предоставляется минимальный пример здесь на основе этого кода
CREATE TABLE table1 (
id INTEGER PRIMARY KEY,
field1 TEXT
)
WITHOUT ROWID;
CREATE TABLE table2 (
id INTEGER PRIMARY KEY,
field2 TEXT
)
WITHOUT ROWID;
CREATE TABLE table3 (
id INTEGER PRIMARY KEY,
field3 TEXT
)
WITHOUT ROWID;
INSERT INTO table1 (field1, id)
VALUES ('FOO0', 0),
('FOO1', 1),
('FOO2', 2),
('FOO3', 3);
INSERT INTO table2 (field2, id)
VALUES ('BAR0', 0),
('BAR2', 1),
('BAR3', 3);
INSERT INTO table3 (field3, id)
VALUES ('PIP0', 0),
('PIP1', 1),
('PIP2', 2);
SELECT *
FROM table1
JOIN (table2, table3) USING (id);
SELECT *
FROM table1
JOIN table2 USING (id)
JOIN table3 USING (id);
Может кто-нибудь объяснить, почему можно использовать один за другим, и если они не эквивалентны для определенных входных данных, приведите пример? Первый, безусловно, выглядит более чистым (по крайней мере, менее избыточным) для меня.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ против ГДЕ предложение было предложено в качестве возможного дубликата. Хотя это касается использования ,
в качестве оператора соединения, я чувствую, что вопросы и особенно ответы в большей степени сосредоточены на удобочитаемости и использовании WHERE
против JOIN
. Мой вопрос больше об общей достоверности и возможных различиях в результатах (учитывая необходимые данные, чтобы вызвать разницу).