2016-10-27 3 views
-2

SQL照会に関するヘルプが必要です。私は「マスターリストテーブル(XとYカテゴリ)」を持っています。私は2つのサブリストのテーブルで上記のリストを比較する必要があります - 「リストX」と「リストY」SQLマスターリストと2つのサブリストを比較する排他的IDを選択してください

テーブル:私は出力クエリを作成しようとしています

*MasterList*    
ID Cat Status   
101 X Ready    
102 X Ready    
103 Y Dispatched Y  
104 X Dispatched Y  
105 Y Dispatched  
106 X Ready 
107 X Dispatched Y 
108 Y Ready Y 
109 X Dispatched 
110 Y Dispatched 
111 X Ready Y 
112 X Dispatched 
113 X Dispatched Y 

*ListX* 
ID  
101 
102 
106 
109 
112 

*ListY* 
ID 
105 
110 

    一覧-Xには使用できません
  1. 猫-X IDのリスト-Y
  2. では使用できません
  3. 猫-YのIDが

出力

ID Cat Status 
103 Y Dispatched 
104 X Dispatched 
107 X Dispatched 
108 Y Ready 
111 X Ready 
113 X Dispatched 

おかげで、

ラヴィ。

+0

Oracleまたはmysql?また、いくつかのサンプルデータ(書式付きテキスト)、必要な結果、これまでに試したものを投稿してください – Aleksej

+0

ありがとうイチゴ、私は同じことをしようとしています:) – Ravi

答えて

0

現在のような、たとえば、いくつかの方法でそれを行うことができます。

select * 
    from master_list 
    where (cat = 'X' and id not in (select id from listx)) 
    or (cat = 'Y' and id not in (select id from listy)) 

も参加しnot existsを試してみて、シンプル。あなたはWHERE句でのORを使用することができます

create table master_list (id int, cat varchar2(1), status varchar2(15)); 
insert into master_list values (101, 'X', 'Ready'); 
insert into master_list values (102, 'X', 'Ready'); 
insert into master_list values (103, 'Y', 'Dispatched'); 
insert into master_list values (104, 'X', 'Dispatched'); 
insert into master_list values (105, 'Y', 'Dispatched'); 
insert into master_list values (106, 'X', 'Ready'); 
insert into master_list values (107, 'X', 'Dispatched'); 
insert into master_list values (108, 'Y', 'Ready'); 
insert into master_list values (109, 'X', 'Dispatched'); 
insert into master_list values (110, 'Y', 'Dispatched'); 
insert into master_list values (111, 'X', 'Ready'); 
insert into master_list values (112, 'X', 'Dispatched'); 
insert into master_list values (113, 'X', 'Dispatched'); 

create table listx as (select column_value id 
         from table(sys.odcinumberlist(101, 102, 106, 109, 112))); 
create table listy as (select column_value id 
         from table(sys.odcinumberlist(105, 110))); 

    ID CAT STATUS 
---- --- --------------- 
103 Y Dispatched 
104 X Dispatched 
107 X Dispatched 
108 Y Ready 
111 X Ready 
113 X Dispatched 
+0

熟考、これは私のために完璧に働いた。比較IDが文字列であっても同じものを使用できますか? – Ravi

+0

はい。私は、すべてのテーブルで同じでなければ、そのタイプの列が重要であるとは思わない。このような情報を主な質問に入れることは常に良いことです。 –

+0

ありがとうございました。私もそれを試みた。ちょうど私が将来それを使用することができるように確認するために:) – Ravi

0

SELECT ID, CAT, STATUS 
    FROM MASTERLIST M 
WHERE (M.ID NOT IN (SELECT ID FROM LISTX) AND CAT = 'X') 
    OR (M.ID NOT IN (SELECT ID FROM LISTY) AND CAT = 'Y'); 

他の代替は、2つのquerysにルールを分離することであろうと、Oracleと出力の


試験データUNION ALLと組み合せてALL:

SELECT ID, CAT, STATUS 
    FROM MASTERLIST M 
WHERE M.ID NOT IN (SELECT ID FROM LISTX) AND CAT = 'X' 
UNION ALL 
SELECT ID, CAT, STATUS 
    FROM MASTERLIST M 
WHERE M.ID NOT IN (SELECT ID FROM LISTY) AND CAT = 'Y'; 

どちらの手法も同じ結果につながります。実際、一部のオプティマイザ(オラクルのような)は、最初のソリューションをリアルタイムで2番目のソリューションに変換しようとします。これをOR拡張と呼びます。

関連する問題