2017-02-14 12 views
0

次のように私はTable1を持っている:SQL SELECT;アカウントに関連付けられた名前を選択します。三つのユースケース

Account Name  Flagged 
------- ----  ------- 
001  John  0 
001  Jacob  0 
002  Austin  0 
002  Ashley  1 
003  Mary  1 
003  Megan  1 

は、これは私が把握しようとしているものの簡体版です。基本的に私はアカウントIDのセットを持っています、それぞれのアカウントIDは基本的に無限の数の名前を付けることができます。いくつかの名前は1つの名前を持ち、いくつかは1000の名前を持ちます。それぞれの名前は、各アカウントについて0または1

をフラグが立てられている、私がしたい:すべての行が= 0

  • をフラグが立てられている場合

    1. は、すべての行を選択し、すべての行が= 1
    2. をフラグが立てられている場合は、すべての行を選択
    3. 行にフラグが混在している場合は、フラグが0の行のみを選択します。私。いくつかは、いくつかは、この小さなテーブルのために1

    です0あり、私はそれが

    Account Name  Flagged 
    ------- ----  ------- 
    001  John  0 
    001  Jacob  0 
    002  Austin  0 
    003  Mary  1 
    003  Megan  1 
    
  • +0

    ルールを説明する別の方法です。フラグ= 0の行を返す(1)、フラグ== 0の行がない限り(2.)行をフラグ= 1にする。 – spencer7593

    答えて

    2

    これは、優先順位付けクエリの形式であるを返したいと思います。私は最も簡単な方法があると思いnot existsunion allと:

    select t1.* 
    from table1 t1 
    where t1.flagged = 0 
    union all 
    select t1.* 
    from table1 t1 
    where t1.flagged = 1 and 
         not exists (select 1 
            from table1 tt1 
            where tt1.account = t1.account and tt1.flagged = 0 
           ); 
    

    発想は単純です:次に該当する行を持つが存在しない場合にのみ、1の旗を持っているすべての行を選択し、0のフラグを付けてすべての行を選択ゼロ。

    +0

    +10。猫を肌に触れる最も簡単な方法の一つです。 – spencer7593

    0

    指定された結果を返す方法はいくつかあります。

    SELECT t.account 
        , t.name 
        , t.flagged 
        FROM (SELECT n.account 
           , MIN(n.flagged) AS mf 
          FROM [Table1] n 
          WHERE n.flagged IN (0,1) 
          GROUP BY n.account 
         ) s 
        JOIN [Table1] t 
        ON t.account = s.account 
        AND t.flagged = s.mf 
    ORDER BY t.account, t.name, t.flagged 
    

    :インライン・ビューに参加使用方法の例をここ

    SELECT t.account 
        , t.name 
        , t.flagged 
        FROM [Table1] t 
    WHERE t.flagged = 0 
        OR (t.flagged = 1 AND NOT EXISTS 
             (SELECT 1 
              FROM [Table1] f 
              WHERE f.account = t.account 
               AND f.flagged = 0 
             ) 
         ) 
    ORDER BY t.account, t.name, t.flagged 
    

    ある:ここ

    はNOTがEXISTS述語と相関サブクエリを使用して、1つのアプローチの例です

    EDIT:元の例では、MySQL構文を使用していました。構文がSQL Serverと互換性があるようにクエリが改訂されました。

    3

    ゴードンの解決策は正しいです。ただし、MINウィンドウ関数を使用して、アカウントごとに最小限のフラグを取得することもできます(フラグ付きの値は0と1のみと仮定します)。

    select account,name,flagged 
    from (select t.*,min(flagged) over(partition by account) as min_flag 
         from tablename t 
        ) x 
    where flagged=min_flag