2017-02-15 4 views
3

1つのruleidが2である連絡先を検索したい場合は、sqlのヘルプが必要です。したがって、出力は連絡先IDの1と7である必要があります。 私は探していません彼らは、誰かがこれを助けてください、彼らはOracle sqlが重複から1行を検索する

Contactid ruleid 
1     2 
5     3 
5     2 
6     4 
6     2 
7     2 

2 ruleid持っているにもかかわらず、複数のruleidを持っているように、出力で5 & 6のコンタクトIDの。このような

SELECT Contactid FROM <YOURTABLE> 
WHERE ruleid = 2 
AND Contactid NOT IN 
    (SELECT Contactid FROM <YOURTABLE> 
    WHERE ruleid <> 2) 
+0

重複する行(同じ 'contactid' **と**同じ' ruleid'を同時に意味する)は可能ですか?例えば、 'contactid = 8'と' ruleid = 2'(そして 'contactid'のための他の行はありません)という2つの行がある場合、結果はどうなるでしょうか?また、 'contactid'か' ruleid'が 'NULL'ですか?あなたの返信は – mathguy

+0

Thxです。連絡先ID 8とルール2が繰り返される行は重複することはできません。また、両方の列でNULLを使用することはできません。 – sam2539431

答えて

2

あなたはこのような何かを試みることができます。

select contactid 
from  table_name 
group by contactid 
having min(ruleid) = 2 
    and max(ruleid) = 2 
+2

'not in'は' contactid'が 'NULL'かもしれないと意図した通りに動作しないかもしれません。また、正解(集約または 'GROUP BY'クエリのバリエーション)は、基本テーブルを2回ではなく1回だけ読み取る必要があります。 – mathguy

+0

@mathguyそうですね、サブクエリを使うよりもグループ化が効率的です。 – nbouchet

0

何かが動作するはずですし、効率的になります。

+0

興味深い - 私はdownvoteを参照してください。ダウンローダが、このクエリで間違っていたことをコミュニティと分かち合うよう気をつけますか?みんなの利益のために?ありがとうございました! – mathguy

+0

こんにちは、あなたの質問は私のために不思議でした..それは完璧に働いた。ありがとうございました。 – sam2539431

1
WITH your_table_name as(
     SELECT 1 AS Contactid , 2 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 5 AS Contactid , 3 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 5 AS Contactid , 2 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 6 AS Contactid , 4 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 6 AS Contactid , 2 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 7 AS Contactid , 2 AS ruleid FROM DUAL 
) 

SELECT t.* FROM (
     SELECT Contactid FROM your_table_name 
     WHERE ruleid = 2 
     GROUP BY Contactid 
     HAVING COUNT(*) = 1 
    ) t 
    left JOIN (
     SELECT Contactid FROM your_table_name 
     WHERE ruleid <> 2 
     GROUP BY Contactid 
    ) tt 
    ON 
    t.Contactid = tt.Contactid 
    where tt.Contactid is null 
+0

こんにちは私はこれを試して、また、条件をruleid = 2のために追加しましたが、これは動作しませんでした。 – sam2539431

+0

私のクエリは、テーブルからwhereidを選択しましたwhere where where countid(ruleid)= 1 – sam2539431

+0

@ sam2539431 - 何かを追加する必要はありません。私はCTEで私の答えを更新しました、それを見てください。 –

0

これはあなたのために十分ではないのですか?

select contactid from table group by contactid having count(ruleid)=1 
+0

これはすべての 'contactid' **が' ruleid = 2'の行を持つことを想定しています。これは提供されたサンプルデータに当てはまりますが、問題の声明では保証として述べられていません。 (それでもまだ真実かもしれません!) – mathguy

+0

こんにちは、あなたの返信のthx。連絡先がルール2を持たない可能性があります。 – sam2539431

+0

???ここで私はルールID = 2を確認していますか?返信のために –

関連する問題