0

複数の結合を行ってレコードを取得しています。OR条件でもう1つ追加する必要があります。

テーブルありPayment。からPayment参加する必要があります:

  • テーブル Package1(Payment.PaymentTypeID=1 の場合) または
  • 表 Package2 (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
4

4 に答える 4

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結合条件で使用すると、クエリの最適化が難しくなることがよくあります。

編集:

2 つのテーブルがある場合は、次のように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;
于 2013-09-19T11:32:17.097 に答える
1

試す :

select 
   P1.VoucherID 
from 
   Payment P 
inner join Package1 P1 
   on P1.empid=P.empid 
   and P.PaymentTypeID IN (1,3)
于 2013-09-19T11:32:15.277 に答える
0

私はそれらを1つの選択ステートメントで実行しCOALESCE、最初の非null値を抽出するために使用します。

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
于 2013-09-19T11:50:45.323 に答える