【问题标题】:SQL Select exclusive ids comparing master list with two sub listsSQL Select 将主列表与两个子列表进行比较的独占 id
【发布时间】:2017-03-09 22:19:17
【问题描述】:

我需要有关 SQL 查询的帮助。我有一个“主列表表(X 和 Y 类别)”。我必须将上面的列表与两个子列表表进行比较——“列表 X”和“列表 Y”

表格:

*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

我正在尝试创建一个输出的查询:

  1. 在 List-X 中不可用的 Cat-X ID
  2. 在 List-Y 中不可用的 Cat-Y ID

输出

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

谢谢,

拉维。

【问题讨论】:

  • Oracle 还是 mysql?另外,请发布一些示例数据(格式化文本)、所需结果以及到目前为止您尝试过的内容
  • 谢谢草莓,我也在尝试这样做:)

标签: mysql sql oracle join outer-join


【解决方案1】:

您可以通过多种方式进行操作,例如这里:

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 和简单的连接。


在Oracle中测试数据并输出:

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

【讨论】:

  • 想想,这对我来说很完美。即使比较 ID 是字符串,我也可以使用相同的吗?
  • 是的。我不认为这种类型的列应该重要,除非它们在所有表中都相同。把这些信息放在主要问题上总是好的。
  • 谢谢思考。我也试过了。只是为了确认一下,以便我将来可以使用它:)
  • 很高兴我能帮上忙 :-) 如果这结束了问题,请将我们的答案之一标记为已接受。
【解决方案2】:

您可以在 WHERE 子句中使用 OR:

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');

另一种选择是将两个查询中的规则分开,然后与 UNION 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';

这两种技术将导致相同的结果。实际上,一些优化器(如 Oracle 的)会尝试将第一个解决方案实时转换为第二个解决方案。这称为 OR 扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多