Я хотел бы подтвердить, возможно ли создать JOIN с условием OR и как (для меня это не работает):

SELECT * FROM table_a
LEFT JOIN table_b
ON table_a.field_1 = table_b.field_1 OR table_a.field_2 = table_b.field_2

Я попробовал эквивалентный запрос, но он не работал. Как я могу заставить это работать?

0
Felipe Vásquez 21 Дек 2019 в 03:13

2 ответа

Да, это возможно - в выражении ON допускается любое логическое выражение, даже подзапрос.

OR обычно убивает производительность.

Запрос, такой как этот:

SELECT *
FROM table_a a LEFT JOIN
     table_b b
     ON a.field_1 = b.field_1 OR 
        a.field_2 = b.field_2;

Часто можно переписать как:

SELECT a.*,
       COALESCE(b1.col, b2.col) as col  -- choose the column value from one of the `b` tables
FROM table_a a LEFT JOIN
     table_b b1
     ON a.field_1 = b1.field_1 LEFT JOIN
     table_b b2 
     ON b2.field_2 = b2.field_2 AND
        b1.field_1 IS NULL    -- no match on other column

Два таких соединения часто намного эффективнее.

1
Gordon Linoff 21 Дек 2019 в 00:15

Думали ли вы использовать UNION вместо OR?
Логически, UNION является формой, эквивалентной OR. Например:

SELECT * FROM table_a
LEFT JOIN table_b ON table_a.field_1 = table_b.field_1 
UNION
SELECT * FROM table_a
LEFT JOIN table_b ON table_a.field_2 = table_b.field_2
;

Большая из этих двух таблиц должна иметь два индекса (один для field_1 и другой для field_2). Таблица меньшего размера будет полностью отсканирована, а затем отсканирована с диапазоном сканирования для соединения

0
Roger Cornejo 21 Дек 2019 в 01:24