Соединить две таблицы - несколько условий. Последующие условия, которые будут использоваться, если они не связаны с предыдущими условиями - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать логику соединения из двух таблиц, в которых мне нужно выбрать условие соединения, если это выполняется способом «соединение по столбцу 1, если не объединено - по столбцу 2, если не объединено - по столбцу 3». У меня проблемы с его сборкой простым способом.

Просто, чтобы дать некоторое представление, я пытаюсь найти все продукты, на которые распространяется контракт. Иногда продукты явно упоминаются в ProductId, но если соединение не удается (так как был указан неправильный ProductId), я хочу использовать название бренда, чтобы найти все продукты под этим брендом и предположить, что все они подпадают под действие договора. Соответствие торговой марки будет менее точным, поэтому я хочу использовать его только в том случае, если не смог найти подходящую продукцию по ProductId.

Для иллюстрации представьте, что у меня есть две таблицы: Prosucts, со столбцами ProductId и BrandName; также таблица Контракты с таблицей ContractId, Brand, ProductId, Value. Для этой таблицы ProductId и Brand могут быть нулевыми или иметь значения, не указанные в Products.

Я хочу присоединиться к Контрактам с такими продуктами, что:

  • Попробуйте присоединиться слева, где Contracts.ProductId = Products.ProductId
  • Для тех записей в Контрактах, где присоединение не было успешным, присоединитесь к Продуктам, где Contracts.Brand = Products.Brand
  • Если оба условия соединения были неудачными - вернуть null

Есть ли способ сделать эту последовательную логику соединения, при которой условия соединения пробуются одно за другим? Просто чтобы подчеркнуть, у меня есть более двух условий присоединения в реальности. Спасибо!

Пример данных:

Контракты:

ContractId  Brand   ProductId
C1  Mars    P1
C2  Nestle  P2
C3  PepsiCo P3

Продукты:

ProductId   Brand
P1  NULL
P2  Mars
P4  PepsiCo
P5  PepsiCo

Ожидаемый результат

ContractId  ProductId
C1  P1
C2  P2
C3  P4
C3  P5

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вы можете попробовать ниже, используя объединение нескольких экземпляров таблицы контрактов и coalesce() функцию

DEMO:

 select productid,coalesce(c.brand,b.brand) as brand 
    from Products a left join Contracts b on a.brand=b.brand 
    left join Contracts c on a.productid=c.productid
0 голосов
/ 30 октября 2018

Вы можете попробовать вот так:

select p.productId, p.brandName, c.contractId 
from Products p left join Contracts c on
(p.productId = c.productId or p.productId=c.brand);

Здесь предложение or поможет вам получить желаемый результат.

...