2017-05-02 15 views
0

次のようなシナリオがある:私はこの2つのテーブルを持っている:結合が複数の行に一致する場合、1つの表から行を選択するにはどうすればよいですか?

(TABLE1) 
SUPER_ID| NAME | 
-------+-- 
1 | BOB | 


(TABLE2) 
ID| SUPER_ID | 
-------+----+ 
1 | 1  | 
2 | 1  | 
3 | 1  | 

私は

`SELECT a.super_id, a.name 
    FROM TABLE1 a LEFT OUTER JOIN TABLE2 b ON a.super_id = b.super_id 
    WHERE a.super_id = 1` 

ように、これらの2つのテーブルを結合した場合、結果は私が選択することができますどのように

SUPER_ID| NAME | 
-------+-------- 
1  | BOB | 
1  | BOB | 
1  | BOB | 

になりますGROUP BYを使用せずにTABLE1からの行のみ?おかげ

UPDATE:オクラホマので、私は3番目のテーブルを持っている...

(TABLE3) 
ID| TYPE | 
-------+----+ 
1 | A  | 
2 | B  | 
3 | C  | 

私はTABLE2 ASに参加する必要があります。

SELECT a.super_id, a.name 
    FROM TABLE1 a INNER JOIN 
     TABLE2 b ON a.super_id = b.super_id INNER JOIN 
     TABLE3 c ON b.id = c.id 
WHERE a.super_id = 1 
+0

TABLE2とTABLE3の関係は何ですか? 1:M? N:M?そのためにいくつかのデータを投稿してください。将来的には、あなたの質問を最小限で完全な形にしてください。細部と繰り返しの繰返し抽出は、みんなの時間を無駄にするだけです。 – APC

+0

あなたが3つのテーブルに参加したいので、参加を理解するために数分を要します:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/あなたの期待することは何ですか?結果セットの外観は? – xQbert

+0

あなたのお返事ありがとうございます@xQber;私はFROM句でサブクエリを使って自分の要求を達成することができます。 @Charles Bretanaによって提案されているように。 TABLE2に複数の一致があってもTAABLE1に基づいて結果セットを制限しようとしていました –

答えて

1

他の[ユニークな]基準に基づいて結合を制限することによって、もちろん、SQLの構文は、あなたが選択する他の基準に依存します。表は、あなたがこれを行うことがタイムスタンプ列がある場合は、最新のレコードが入ったとしましょう

SELECT a.super_id, a.name 
FrOM TABLE1 a LEFT JOIN TABLE2 b 
    ON b.super_id = a.super_id 
    and b.timestamp = (Select Max(timestamp) 
         From TABLE2 
         Where super_id = a.super_id) 
WHERE a.super_id = 1 

あなたはタイムスタンプを持っていませんが、一意のインデックスまたはキーを持っている場合(idは、このようなあるように見えます)、それを使用することができます:

SELECT a.super_id, a.name 
FrOM TABLE1 a LEFT JOIN TABLE2 b 
    ON b.super_id = a.super_id 
    and b.id= (Select Max(id) 
       From TABLE2 
       Where super_id = a.super_id) 
WHERE a.super_id = 1 
+0

ありがとう;私はあなたのアプローチ(最初のもの)を使用して終了しました。 Max()を使用する代わりに、私はDISTINCT()を使って火格子を使っています! –

0

はそれを行うには多くの方法があります。

table2にsuper_idがある場合は、table1の行を使用するとします。あなたが使用することができます

あなたはWITH句の中にGROUP BYを使用することができます

SELECT a.super_id, a.name 
FROM TABLE1 a 
WHERE EXISTS (SELECT NULL FROM table2 b WHERE a.super_id = b.super_id) 
AND a.super_id = 1 

UPDATE

をEXISTS。

WITH single_b AS (SELECT super_id, name 
        FROM table2 
        GROUP BY super_id, name) 
SELECT a.super_id, a.name 
FROM TABLE1 a INNER JOIN single_b b ON a.super_id = b.super_id 
       INNER JOIN TABLE3 c ON b.super_id = c.id 
WHERE a.super_id = 1 
+0

あなたの応答に感謝します。事は、私は3番目のテーブル(テーブル3)を結合する必要があるということです。テーブル3のINNER JOIN TABLE 3 C ON b.ID = c.ID ... –

関連する問題