1

我有两张桌子:

acc_num ser_code
1 一个
1
1 C
2 C
2 D

第二个是:

ser_code 价值
一个 5
8
C 10
D 15

我想排除所有服务代码为 10 或 15 的帐户。因为我的数据集很大,我想使用 NOT EXIST 但它只是排除了 acc_num 和 ser_code 的组合。我想用所有的 ser_code 排除 acc_num,因为它的 ser_code 符合我的标准。

我用过:
select acc_num, ser_code
from table 1
where NOT EXIST (select 1
FROM table 2 where acc_num = acc_num and value in (10, 15)

上面的代码输出是:

acc_num ser_code
1 一个
1

欲望输出将是空的。

4

2 回答 2

0

给你

select t1.acc_num,t1.ser_code from table1 t1, table2 t2 
where (t1.ser_code=t2.ser_code and  t2.value not in (10,15)) 
and t1.acc_num  not in 
(
    select t3.acc_num from table1 t3,table2 t4 
    where t1.acc_num=t3.acc_num and t3.ser_code=t4.ser_code 
    and  t4.value  in (10,15)
) ;
于 2021-12-15T00:52:43.790 回答
0

这可以通过多种方式实现。但是使用NOT EXISTS是最好的选择。您的查询的问题是acc_num1,有些ser_code没有 10、15 的值。所以你会得到A结果B

要克服这一点,您必须拉acc_numsub-query

查询 1(使用 NOT EXISTS):

正如您在下面的查询中看到的,我已包含acc_numinside sub-query,以便过滤器正常工作,

SELECT DISTINCT a.acc_num, a.ser_code 
FROM one as a
WHERE NOT EXISTS
       (
       SELECT DISTINCT one.acc_num 
       FROM two 
       INNER JOIN one
           ON one.ser_code=two.ser_code
       WHERE value IN (10,15) AND a.acc_num=one.acc_num
       )

查询 2(使用 LEFT JOIN):

由于它的性质,不存在经常令人困惑(fast虽然超级)。因此LEFT JOIN也可以使用(比 贵NOT EXISTS),

SELECT DISTINCT a.acc_num, a.ser_code 
FROM one as a
LEFT JOIN 
       (
       SELECT DISTINCT one.acc_num 
       FROM two 
       INNER JOIN one
           ON one.ser_code=two.ser_code
       WHERE value IN (10,15)
       ) b
   ON a.acc_num=b.acc_num
WHERE b.acc_num IS NULL

查询 3(使用 NOT IN):

NOT IN也可以通过综合查询来实现这一点,但比上述两种方法都昂贵,

SELECT DISTINCT a.acc_num, a.ser_code 
FROM one as a
WHERE a.acc_num NOT IN
       (
       SELECT DISTINCT one.acc_num 
       FROM two 
       INNER JOIN one
           ON one.ser_code=two.ser_code
       WHERE value IN (10,15)
       )

所有 3 将产生相同的结果。我宁愿选择NOT EXISTS

请参阅db<>fiddle中的时间消耗演示

于 2021-12-15T05:52:01.233 回答