2017-09-25 5 views
0

申し訳ありませんが、私は正しい軌道に乗っていますが、望ましい結果を得るのが難しいと思います。私は特定のフラグのテーブル内の2つの異なる列をチェックしようとしていて、次にそのフラグを第2の列に関連づけようとしています。異なる列で複数の条件を選択する

例えば、私が言っているテーブル:

出力をする必要は何
ID date  flag  flag_id 
----------------------------------- 
1 09/25/2017 NO  0001 
2 09/25/2017 OTHER  0002 
3 09/25/2017 NO  0002 
4 09/25/2017 OTHER  0003 
5 09/25/2017 OTHER  0004 
6 09/25/2017 NO  0005 
7 09/25/2017 OTHER2 0005 
8 09/25/2017 OTHER  0006 

は(NOライン自体を除く、flag_id年代とそのフラグ欄にNOを含むものだけを繰り返し含む行でありますしたがって、NOを表示しないデータの行のみ)。したがって、この場合にのみ出力ライン2と7私はすでに次のようになります何か書かれている:ここで初心者のミスを作る

SELECT distinct 
    t1.ID, 
    t1.date, 
    t1.flag, 
    t1.flag_id, 
FROM table1 t1 
WHERE (SELECT COUNT(*) 
    FROM table1 t2 
    WHERE t1.flag_id = t2.flag_id 
    AND t1.flag != 'NO' 
    AND t2.flag = 'NO')>1 

を、そしてあなたの心は、私はまだこれに非常に新しいですので、上の説明なぜこれが動作していないのか、それとも何か他の点がうまくいくのは分かりますか?

+0

あなたが実行している場合を除き、私はあなたがそこに結果を得るために異なるIDを取得することも可能ですかが表示されません別のクエリまたは私はあなたの問題を誤解しています。 – ZLK

+0

例を再フォーマットして削除しましたが、これは上記の結果を得ることのみを試みているので、今やもっと意味をなさないはずです。 :) – maaier

答えて

1

代わりにEXISTS:あなたは、複数の異なるフラグを持っているとき

SELECT 
    t1.ID, 
    t1.date, 
    t1.flag, 
    t1.flag_id 
FROM table1 t1 
WHERE exists (SELECT 1 
     FROM table1 t2 
    WHERE t1.flag_id = t2.flag_id 
    AND t1.flag != 'NO' 
    AND t2.flag = 'NO') 

も動作します:

SQL Fiddle

MS SQL Serverの2014スキーマのセットアップ

CREATE TABLE Table1 
    ([ID] int, [date] datetime, [flag] varchar(10), [flag_id] int) 
; 

INSERT INTO Table1 
    ([ID], [date], [flag], [flag_id]) 
VALUES 
    (1, '2017-09-25 10:00:00', 'NO', 0001), 
    (2, '2017-09-25 10:00:00', 'OTHER', 0002), 
    (3, '2017-09-25 10:00:00', 'NO', 0002), 
    (4, '2017-09-25 10:00:00', 'OTHER', 0003), 
    (5, '2017-09-25 10:00:00', 'OTHER', 0004), 
    (6, '2017-09-25 10:00:00', 'NO', 0005), 
    (7, '2017-09-25 10:00:00', 'OTHER', 0005), 
    (8, '2017-09-25 10:00:00', 'OTHER2', 0005), 
    (9, '2017-09-25 10:00:00', 'OTHER', 0006) 
; 

クエリ1

SELECT 
    t1.ID, 
    t1.date, 
    t1.flag, 
    t1.flag_id 
FROM table1 t1 
WHERE exists (SELECT 1 
     FROM table1 t2 
    WHERE t1.flag_id = t2.flag_id 
    AND t1.flag != 'NO' 
    AND t2.flag = 'NO') 

Results

| ID |     date | flag | flag_id | 
|----|----------------------|--------|---------| 
| 2 | 2017-09-25T10:00:00Z | OTHER |  2 | 
| 7 | 2017-09-25T10:00:00Z | OTHER |  5 | 
| 8 | 2017-09-25T10:00:00Z | OTHER2 |  5 | 
+0

はい、これはこれを行う効率的な方法です。 – LAS

0

出力がクエリに意味をなさない。これは、フラグがNoであるすべての行を返します。ただし、フラグがNoの別の行が存在します。これが存在すると、クエリが停止する場所がより効率的になります。クエリを拡張したい場合は、これが良いかもしれません。あなたが使用することができます

SELECT distinct 
    t_other.ID, 
    t_other.date, 
    t_other.flag, 
    t_other.flag_id, 
FROM table1 t_no 
    inner join table1 t_other on t_no.flag_id = t_other.flag_id 
WHERE t_no.flag = 'NO' and t_other.flag <> 'NO' 
+0

私はこの答えが好きです、今私はもっと面白い状況があります。データセットに3つの異なるフラグ( 'NO、OTHER、OTHER2')が含まれているとし、重複した' flag_id'sを含むすべての行を出力したいが、 'NO'の行は除外したい。また、フラグの数が100までで、それぞれの 'フラグ 'を正確に指定しないと仮定します。 – maaier

+0

@maaier両方のソリューションを試してみることをおすすめします。彼らは同じ答えを返すと期待していますが、あなたが結果セットからNoを取り除きたいので、chaの答えはより効率的に実行されます。 – LAS

関連する問題