0

シナリオを説明してみましょう。私は2つのテーブルA(列 - A1、A2、A3)とB(列 - B1、B2、B3)を持っています。A1.B2 でテーブル A とテーブル B を結合する必要があります。結合ごとに、テーブル B には、B3 (X または Y) の値が異なる 1 つまたは 2 つのレコードがあります。JOIN クエリで B3=X の行を選択する必要があるクエリを 1 つ書きたい (B3=Y の行が他にない場合)。2 つの行が存在する場合 (B3=X & B3=Y)、クエリは B3=Y の行のみを選択する必要があります (B3=X の行は無視されます)。

テーブルにいくつかの値を与えて、もう少し説明してみましょう。

表 A
********
A1 A2 A3
1 11 111
2 22 222
3 33 333
4 44 444

表 B
********
B1 B2 B3
6 1 ×
7 1 有
8 2 X
9 3 X
10 3 年
11 4 ×

再び.. JOIN は A1.B2 にあります。結果は次のようになります。

参加結果
*************
A1 A2 A3 B1 B2 B3
1 11 111 7 1 有
2 22 222 8 2 ×
3 33 333 10 3 年
4 44 444 11 4 ×

私の質問について何か説明があれば教えてください。

前もって感謝します。ヨギ

4

4 に答える 4

3

ROW_NUMBER結合列で分割し、「選択順序」列で並べ替えると、関数を使用してテーブル B から行を選択できます。

SELECT b1, b2, b3,
       ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY b3 DESC) as rn
  FROM b;

1 Y 1
1 X 2
2 X 1
3 Y 1
3 X 2
4 X 1

次に、最初の行である次の行をフィルタリングできますrn=1

SELECT b1, b2, b3
  FROM (SELECT b1, b2, b3,
               ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY b3 DESC) as rn
          FROM b)
 WHERE rn=1;

7  1 Y
8  2 X
10 3 Y
11 4 X

フィルタリングされた行は、テーブル a に結合できます。

SELECT *
  FROM a 
  JOIN (
        SELECT b1, b2, b3
          FROM (SELECT b1, b2, b3,
                       ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY b3 DESC) as rn
                  FROM b
                )
          WHERE rn=1
       ) bfilter  ON a.a1 = bfilter.b2;

1 11 111  7 1 Y
2 22 222  8 2 X
3 33 333 10 3 Y
4 44 444 11 4 X   

'X' と 'Y' が実際の値でない場合は、ステートメントを使用してORDER句を拡張して、一般的な値を許可できます。CASE

 ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY 
   CASE b3 WHEN 'Y' THEN 1
           WHEN 'X' THEN 2
           ...
    END ASC)

編集:

 SELECT a1, a2, a3, b1, b2, b3
   FROM (
         SELECT a1, a2, a3, b1, b2, b3,
                ROWNUMBER() OVER (PARTITION BY a1 ORDER BY 
                   CASE WHEN a2=... AND b3=... THEN 1
                        WHEN a2=... AND b3=... THEN 2
                        ...
                   END ASC)
          FROM a JOIN b ON a.a1 = b.b2
        ) 
  WHERE rn = 1;
于 2013-01-10T09:39:25.303 に答える
1

次のように左外部結合を使用できます

select A.A1, A.A2, A.A3, 
nvl(BT1.B1, BT2.B1), 
nvl(BT1.B2, BT2.B2),
nvl(BT1.B3, BT2.B3) from A 
left outer join B BT1 on A.A1 = BT1.B2 and BT1.B3 = 'Y'
left outer join B BT2 on A.A1 = BT2.B2 and BT2.B3 = 'X'

さまざまな結合の適切な説明は、http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlにあります。

于 2013-01-10T09:24:19.057 に答える
0

これが、私がそれを行う方法です:

  • 参加する
  • B2でグループ化
  • 最大を取る(B3)

そうすれば、アルファベット順でより高い値 (Y) が利用できない場合にのみ、X が選択されるようになります。

于 2013-01-10T09:19:56.227 に答える