2016-10-13 4 views
3

Согласно этому SQL join cheat-sheet, левое внешнее соединение на одной колонки, следующий:SQL левое внешнее соединение по нескольким столбцам

SELECT * 
    FROM a 
    LEFT JOIN b 
    ON a.foo = b.foo 
    WHERE b.foo IS NULL 

мне интересно, что это будет выглядеть с объединением на несколько столбцов, должны это OR или AND в статье WHERE?

SELECT * 
    FROM a 
    LEFT JOIN b 
    ON a.foo = b.foo 
    AND a.bar = b.bar 
    AND a.ter = b.ter 
WHERE b.foo IS NULL 
    OR b.bar IS NULL 
    OR b.ter IS NULL 

или

SELECT * 
    FROM a 
    LEFT JOIN b 
    ON a.foo = b.foo 
    AND a.bar = b.bar 
    AND a.ter = b.ter 
WHERE b.foo IS NULL 
    AND b.bar IS NULL 
    AND b.ter IS NULL 

?

(я не думаю, что это делает, но в случае, если это имеет значение, то дб двигатель Vertica в)

(я ставлю на OR один)

ответ

5

Это зависит от того, являются ли столбцы обнуляемым, но при условии, что они не являются, проверки любой из них будет делать:

SELECT * 
    FROM a 
    LEFT JOIN b 
    ON a.foo = b.foo 
    AND a.bar = b.bar 
    AND a.ter = b.ter 
WHERE b.foo IS NULL -- this could also be bar or ter 

Это происходит потому, что после успешного соединения, все три колонки будет иметь ненулевое значение.

Если некоторые из этих столбцов имеют значение NULL, и вы хотите проверить, имело ли какое-либо из них значение после объединения, тогда ваш первый (OR) подход был бы в порядке.

1

Вы можете использовать любую комбинацию критериев для присоединения:

SELECT * 
FROM a 
LEFT JOIN b ON a.foo = b.foo AND a.bar = b.bar AND a.ter = b.ter 

Предложение WHERE не имеет ничего общего с самим присоединиться. WHERE b.foo IS NULL в первом запросе будет возвращать все записи от a, у которых не было соответствующих записей в b или когда b.foo был null.

Смежные вопросы