2013-09-19 5 views
0

Я получаю записи, выполняя несколько множественных объединений. Мне нужно добавить еще один с условием ИЛИ.Использование ИЛИ Условие в JOINS

Существует таблица Payment. От Payment должны присоединиться с:

  • таблицы упаковке1 (если Payment.PaymentTypeID = 1) ИЛИ с
  • таблицы упаковке2 (если Payment.PaymentTypeID = 3).

Обе таблицы Package1 и Package2 имеют столбец VoucherID и должны быть извлечены на основе вышеуказанного условия. Я могу сделать это по нижестоящему запросу, используя Union или Union All, но, пожалуйста, дайте мне знать, могу ли я это сделать без использования UNION или Union All.

select P1.VoucherID from Payment P 
inner join Package1 P1 on P1.empid=P.empid and P.PaymentTypeID=1 

union all 

select P2.VoucherID from Payment P 
inner join Package1 P2 on P2.empid=P.empid and P.PaymentTypeID=3 
+0

Используйте 'UNION ALL'. Почему бы вам не захотеть? –

+0

Должно ли заявление после объединения всех присоединиться к Package2? Является ли Package1 опечаткой? – CarllDev

ответ

1

Try:

select 
    P1.VoucherID 
from 
    Payment P 
inner join Package1 P1 
    on P1.empid=P.empid 
    and P.PaymentTypeID IN (1,3) 
2

Вы можете положить or в состоянии on:

select P1.VoucherID 
from Payment P inner join 
    Package1 P1 
    on (P1.empid=P.empid and P.PaymentTypeID=1) or 
     (P1.empid=P.empid and P.PaymentTypeID=3); 

Это, в свою очередь, может быть записана в виде:

select P1.VoucherID 
from Payment P inner join 
    Package1 P1 
    on (P1.empid=P.empid and P.PaymentTypeID in (1, 3); 

Это довольно что версия union будет работать лучше. or в состоянии соединения часто затрудняет оптимизацию запроса.

EDIT:

Если у вас есть две таблицы, то left outer join может работать:

select coalesce(P1.VoucherID, P2.VoucherId) as VoucherId 
from Payment P left outer join 
    Package1 P1 
    on (P1.empid = P1.empid and P.PaymentTypeID=1) left outer join 
    Package2 P2 
    on (P1.empid = P2.empid and P.PaymentTypeID=3) 
where P1.VoucherId is not null or P2.VoucherId is not null; 
+0

Привет, Гордон, мне нужно сопоставить две разные таблицы Package1 и Package2 для Payment.PaymentTypeID = 1 и Payment.PaymentTypeID = 3 соответственно. – user1429135

+1

@ пользователь1429135. , , В вашем примере кода в вопросе используется только одна таблица. –

+0

Он должен реально работать как: выбрать из P1.VoucherID платежа P внутреннего соединение упаковке1 P1 на P1.empid = P.empid и P.PaymentTypeID = 1 объединения всех выберите P2.VoucherID от платежа P внутреннего соединения Package1 P2 на P2.empid = P.empid и P.PaymentTypeID = 3 – user1429135

0

Я бы извлечь ваучеры из обеих таблиц упаковке1 и 2, а затем решить, что выбрать в зависимости от значения PaymentTypeId в используя функцию IF().

select IF(P.PaymentTypeID=1, P1.VoucherID, P2.VoucherID) as VoucherId from Payment P 
inner join Package2 P2 on P2.empid=P.empid 
inner join Package1 P1 on P1.empid=P.empid; 
0

Я бы их в 1 выберите даного, а затем использовать COALESCE для извлечения первого ненулевое значение.

SELECT 
    COALESCE(P1.VoucherID, P2.VoucherID) as VoucherID 
FROM 
    Payment P 
INNER JOIN 
    Package1 P1 
ON 
    P1.empid = P.empid AND P.PaymentTypeID = 1 
INNER JOIN 
    Package2 P2 
ON 
    P2.empid = P.empid AND P.PaymentTypeID = 3 
Смежные вопросы