SQL необязательно JOIN - PullRequest
       5

SQL необязательно JOIN

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

У меня есть следующий оператор SQL:

SELECT
    invoice.id         "Invoice ID",
    account.name       "Owner"
FROM
    invoice
LEFT OUTER JOIN account 
    on invoice.customerid = account.id

Однако invoice.customerid может быть учетной записью или контактом.Это определяется другим полем, типом клиента, в таблице счетов-фактур.

Так как я могу изменить свой JOIN на JOIN для разных таблиц для каждой строки на основе значения другого столбца?

ИспользованиеMS SQL Server.

Ответы [ 3 ]

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

Я предполагаю, что есть еще одна таблица 'contact', к которой вам нужно присоединиться, и которую вы хотите вернуть только имя учетной записи или имя контакта, в зависимости от значения столбца customertype.Я сделал предположение, что customertype - это строка, которая может быть либо «account», либо «contact» ниже:

SELECT
    invoice.id 'Invoice ID',
    CASE invoice.customertype  
      WHEN 'account' THEN account.name
      WHEN 'contact' THEN contact.name   
    END 'Owner'
FROM
    invoice
LEFT OUTER JOIN account 
    ON invoice.customerid = account.id
LEFT OUTER JOIN contact
    ON invoice.customerid = contact.id
0 голосов
/ 11 октября 2018

Я бы сделал это следующим образом:

SELECT i.id as Invoice_ID,
       COALESCE(a.name, c.name) as Owner
FROM invoice i LEFT JOIN
     account a
     ON i.customerid = a.id AND i.customerType = 'Account' LEFT JOIN
     contact c
     ON i.customerid = c.id AND i.customerType = 'Contact';

Обратите внимание, что это включает логику customerType в предложениях ON.Это должно сделать JOIN s более точным.

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

вы можете использовать CASE в условии соединения

    SELECT invoice.id   "Invoice ID",
       IsNull(account.NAME,contact.NAME) "Owner"
    FROM   invoice
       LEFT OUTER JOIN account
                    ON account.id = CASE
                                      WHEN invoice.customertype = 'Account'
                                        THEN invoice.customerid
                                      ELSE NULL
                                    END 
       LEFT OUTER JOIN contact
                    ON contact.id = CASE
                                      WHEN invoice.customertype = 'contact'
                                        THEN invoice.customerid
                                      ELSE NULL
                                    END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...