SQL Multiple Left-Join с несколькими критериями

Я работаю в общей сложности с 4 таблицами здесь:

Таблица продуктов: product_id, product_desc

Данные 1 product_id, location_id, data1

Данные 2 product_id, location_id, data2

Данные 3 product_id, location_id, data3

У меня проблема не в том, что каждый product_id или location_id включен в каждую из таблиц данных. У меня есть запрос, чтобы получить данные правильно для первой таблицы данных, но не в тех случаях, когда product_id или location_id не существует в data1, но существует в data2. Я понимаю, что это связано с состоянием, возвращающимся к data1, но я не уверен, как получить location_nbr там иначе. У меня есть другая таблица, в которой перечислены все номера местоположений, но они нигде не соотносятся с таблицей предметов, поэтому я не могу присоединиться к этому.

select 
    item1.*
    ,coalesce(data1.location_id, data2.location_id, data3.location_id) as location_id
    ,data1.data1
    ,data2.data2
    ,data3.data3

from item1
    LEFT OUTER JOIN data1 AS data1
    ON data1.product_id = item1.ksn_id

    LEFT OUTER JOIN data2 AS data2
    ON data2.product_id = item1.ksn_id
    and data2.location_nbr = data1.location_nbr

    LEFT OUTER JOIN data3 AS data3
    ON data3.product_id = item1.ksn_id
    and data3.locn_nbr = data1.location_nbr

2 ответа

Не видя структуру ваших таблиц, трудно рекомендовать точное решение, однако, основываясь на описании, вы должны изучить FULL OUTER JOINS, которые позволят вам включить все product_id и location_id, которые используются где угодно.

Может быть полезным иметь пример желаемого результата, но в его отсутствие я думаю, что UNION или UNION ALL могут выполнить то, что вы ищете:

SELECT Item1.*
     , Data1.*
FROM Item1
LEFT JOIN 
     Data1
  ON Data1.ItemID = Item1.ksn_id
UNION
SELECT Item1.*
     , Data2.*
FROM Item1
LEFT JOIN 
     Data2
  ON Data2.ItemID = Item1.ksn_id
UNION
SELECT Item3.*
     , Data3.*
FROM Item1
LEFT JOIN 
     Data3
  ON Data3.ItemID = Item1.ksn_id;
Другие вопросы по тегам