2017-01-24 6 views
0

私は2つのテーブルを持っています。表AおよびBを参照のこと。SQL - 結合のそれぞれの1つを取得します。

表Aは、質問に重要ではないIDおよびいくつかのデータを有する。 テーブルBにはidとA_idがあります。最後のものは2つを組み合わせるために使用されます。同じA_idを持つ複数の行が存在する可能性があります.1つしかないか、まったく存在しません。

は、私は次の操作を行いますクエリ必要があります。

  1. がテーブルから各行の唯一の1を取得し、テーブル
からそれ
  • 重複なしに、テーブルBに参加し
  • 私はそれが複雑に聞こえるかもしれないことを知っているので、ここに例があります

    表A

    id other info 
    1 ... 
    2 ... 
    3 ... 
    4 ... 
    

    表B

    id A_id 
    1 2 
    2 3 
    3 3 
    4 3 
    

    出力

    A.id other info B.id A_id 
        1 ...  NULL NULL 
        2 ...   1  2 
        3 ...   2  3 
        4 ...  NULL NULL 
    

    だから、A_IDが3となっているテーブルBの複数の行があるにもかかわらず、私はそれらのいずれかが必要です。そして、A_idが1または4のテーブルBの行がないにもかかわらず、私はまだそれらの両方を表示する必要があります。

    これは明らかに私の質問を説明することができますが、私はこの質問を改善する方法についてのフィードバックを与えてください。

  • +0

    あなたが適切なタグを使用してデータベースを指定する必要があります。 –

    +0

    http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-質問 – Strawberry

    +0

    あなたが送るリンクはオフラインです – FlorisdG

    答えて

    0

    ビッグは正しい方向に私をプッシュするためにゴードン・リノフしていただきありがとうございます。最初の答えは:

    select A.*, 
         (select count(B.A_id) from B where B.A_id = A.id) 
    from A 
    

    私は私の質問でこれを語っていないため申し訳ありませんが、私は実際に必要なすべてのテーブルB内の任意の行があった場合はAから、同じ時間のチェックイン時にすべての行を取得することでしたA.idと同じ値を持っていました。

    このクエリは、Aidと同じ値を持つすべての行をカウントします。

    明確にするために、出力が得られます:

    A.id other info count 
        1 ...  0 
        2 ...  1 
        3 ...  3 
        4 ...  0 
    
    1

    私は最も簡単な方法は、相関サブクエリを使用することだと思う:私は今、それをテストすることはできません

    select a.*, 
         (select max(b.id) from b where b.a_id = a.id) 
    from a; 
    
    +0

    (私はopがminを望んでいると思います) – Strawberry

    +0

    ブラケットの間に何が起こっているのか正確には分かりませんが、これは私がしたいことをしませんでした – FlorisdG

    +0

    @VellosFree。 。 。あなたは何をしたいのですか? 'max()'の代わりに 'min()'を使って本当にしたいことはありますか? –

    0

    が、それはあなたがこの

    SELECT * FROM A 
    LEFT JOIN B ON A.ID = B.A_ID 
    

    UPDATEような何かしたいようだ:

    WITH tmp AS (
    SELECT MIN(ID) ID FROM B GROUP BY A_id 
    ) 
    SELECT A.*, B.* FROM B 
    INNER JOIN tmp ON B.Id = tmp.ID 
    RIGHT JOIN A ON A.Id = B.A_Id 
    
    +1

    いいえ、これはテーブルAの重複を引き起こします – FlorisdG

    +0

    私はそれを確認する瞬間を与えます – Kostis

    +0

    私の更新された答えをもう一度確認してください – Kostis

    0

    データベースがANSI SQLをサポートしていると仮定し、Bに複数の行がある場合は、最後のものをb ased on ID:

    with lastB (B_Id) as (
        select max(id) from tableB group by A_id 
    ), 
    BRows as (
    select * from tableB 
        where Id in (select B_Id from lastB) 
    ) 
    select a.field1, a.field2, a.fieldN, 
        b.field1, b.field2, b.fieldN 
    from tableA a 
    left join BRows b on a.Id = b.A_Id 
    

    編集:あなたはあなたの質問を編集し、最初のものを作成しました。それから、max()、min()を作るだけです。

    with lastB (B_Id) as (
        select min(id) from tableB group by A_id 
    ), 
    BRows as (
    select * from tableB 
        where Id in (select B_Id from lastB) 
    ) 
    select a.field1, a.field2, a.fieldN, 
        b.field1, b.field2, b.fieldN 
    from tableA a 
    left join BRows b on a.Id = b.A_Id 
    

    編集:ここでは私が約束したMS SQLのサンプルです:

    DECLARE @tableA TABLE (id INT, other VARCHAR(10)); 
    DECLARE @tableB TABLE 
        (
         id INT , 
         A_Id INT , 
         other VARCHAR(10) 
        ); 
    
    INSERT @tableA 
         (id, other) 
    VALUES (1, 'v1'), 
         (2, 'v2'), 
         (3, 'v3'), 
         (4, 'v4'); 
    
    INSERT @tableB 
         (id, A_Id, other) 
    VALUES (1, 2, 'v21'), 
         (2, 3, 'v31'), 
         (3, 3, 'v32'), 
         (4, 3, 'v33'); 
    
    WITH fromB (B_Id) 
          AS (SELECT MIN(id) 
           FROM  @tableB 
           GROUP BY A_Id 
          ), 
         BRows 
          AS (SELECT * 
           FROM  @tableB 
           WHERE id IN (SELECT B_Id 
               FROM fromB) 
          ) 
        SELECT a.id AS A_Id , 
          a.other AS A_Other , 
          b.id AS B_Id , 
          b.other AS B_Other 
        FROM @tableA a 
          LEFT JOIN BRows b ON a.id = b.A_Id; 
    

    結果:

    A_Id A_Other B_Id B_Other 
    1 v1  NULL NULL 
    2 v2  1 v21 
    3 v3  2 v31 
    4 v4  NULL NULL 
    
    +0

    編集のコードを作ってください。私は正確にあなたがmax()、min()によって何を意味しているのか、あなたが書いたコード内でそれを実装する方法を知りません – FlorisdG

    +0

    あなたが提供するフィールドだけで、Bからの追加データに何が起こるかを見落としています。これらの列があった場合、このコードは必要以上に長いように見えます(実生活Bにはより多くの列があります)。私たちに意味のあるデータをお願いしたいと思います。とにかく、SQLサーバーサンプルを追加します。 –

    関連する問題