-1

ベーステーブルと1:nの関係にある2つのテーブルがあり、どちらもLEFTJOINを実行します。

-------------------------------
Table A    Table B    Table C
-------------------------------
|ID|DATA|  |ID|DATA|  |ID|DATA|
-------------------------------
 1  A1      1  B1      1  C1
 -          -          1  C2

私が使用しているもの:

SELECT * FROM TableA a
    LEFT JOIN TableB b
           ON a.Id = b.Id
    LEFT JOIN TableC c
           ON a.Id = c.Id

しかし、これはTableBの重複を示しています。

1  A1    B1   C1
1  A1    B1   C2

重複を無視するようにこの結合を作成するにはどうすればよいですか?そのような:

1  A1    B1     C1
1  A1    null   C2    
4

3 に答える 3

0

欲しいものを手に入れるには、ロジックを実行する必要があると思います。複数の b.id を削除するには、それらが必要です。を使用してそれらを識別し、ロジックをrow_number()使用caseして後続の値を NULL にすることができます。

select a.id, a.val,
       (case when row_number() over (partition by b.id, b.seqnum order by b.id) = 1 then val
        end) as bval
       c.val as cval
from TableA a left join
     (select b.*, row_number() over (partition by b.id order by b.id) as seqnum
      from tableB b
     ) b
     on a.id = b.id left join
     tableC c
     on a.id = c.id

複数の行が取得されるため、B と C を完全に結合する必要はないと思います。B に ID の行が 2 つあり、C に 3 つの行がある場合、6 になります。3 つだけが必要だと思います。これを実現するには、次のようにします。

select *
from (select b.*, row_number() over (partition by b.id order by b.id) as seqnum
      from TableB b
     ) b
     on a.id = b.id full outer join
     (select c.*, row_number() over (partition by c.id order by c.id) as seqnum
      from TableC c
     ) c
     on b.id = c.id and
        b.seqnum = c.seqnum join
     TableA a
     on a.id = b.id and a.id = c.id

これは、「B」と「C」のリストを列挙し、リストの位置で結合します。完全外部結合を使用して、長いリストの全長を取得します。

最後の結合は両方のテーブルを参照するため、TableA をフィルターとして使用できます。B と C の余分な ID は結果に表示されません。

于 2012-12-12T16:26:14.970 に答える
0

個別に使用しますか

SELECT distinct * FROM TableA a
LEFT JOIN TableB b
       ON a.Id = b.Id
LEFT JOIN TableC c
       ON a.Id = c.Id
于 2012-12-12T16:16:07.573 に答える
0

UNION として実行します。つまり、

 SELECT TableA.ID, TableB.ID, TableC.Id
   FROM TableA a
         INNER JOIN TableB b ON a.Id = b.Id
         LEFT JOIN TableC c ON a.Id = c.Id
 UNION
 SELECT TableA.ID, Null, TableC.Id
   FROM TableA a
         LEFT JOIN TableC c ON a.Id = c.Id

つまり、1 つの SELECT で最初の行を戻し、別の SELECT で 2 番目の行を戻します。あなたが読み取ろうとしているデータについて何も知らないので、少し大雑把ですが、原則は健全です。少し加工し直す必要があるかもしれません。

于 2012-12-12T16:17:36.330 に答える