1

我有这个查询将正确返回作为IN子句一部分的值,但是当我将其更改为 时NOT IN,它不会返回任何内容。
有没有人有什么建议?

select distinct 
    CAST( w.work_area AS CHAR(4) ) || s.code_id as WATT 
from 
    sys_code s, 
    work_area_master w 
where 
    s.code_type = '590' 
    and (
        CAST( w.work_area AS CHAR(4)) || s.code_id
    )  
    in (
        select substr(misc_flags, 1,6) 
        from sys_code where code_type = 'STA'
    );
4

4 回答 4

1

排除原则(即 A 或 ~A 是重言式)不适用于 A 可能为 NULL 的情况。当存在可空字段时,应用三值 loigc,并且必须将排除原则修改为( A 或 ~A 或 A 为 NULL)。

于 2013-03-13T18:26:18.253 回答
1
SELECT DISTINCT
    CAST( w.work_area AS CHAR(4) ) || s.code_id AS what 
FROM sys_code s
JOIN work_area_master w ON 1=1 
WHERE s.code_type = '590' 
AND EXISTS (
    SELECT * FROM sys_code xx
    WHERE xx.code_type = 'STA'
    AND substr(xx.misc_flags, 1,6) = CAST( w.work_area AS CHAR(4)) || s.code_id
    );

脚注:我故意使用JOIN ... ON 1=1语法来引起人们注意原始查询甚至没有连接条件的事实(相关IN子查询中的除外)

于 2013-03-13T19:14:44.687 回答
0

检查sys_code和的组合是否work_area_master有效实际上可以JOIN条件。

也使用EXISTS而不是IN避免已经提供的@wiplasserNULL之类的问题:

SELECT DISTINCT
       CAST( w.work_area AS CHAR(4) ) || s.code_id AS what 
FROM   sys_code s
JOIN   work_area_master w ON EXISTS (
          SELECT 1
          FROM   sys_code x
          WHERE  x.code_type = 'STA'
          AND    substr(x.misc_flags, 1,6)
                 = CAST(w.work_area AS CHAR(4)) || s.code_id
          )
WHERE  s.code_type = '590' ;

有关 and 问题的详细说明NOT IN,请参阅dba.SE 上NULL的这个密切相关的问题。

于 2013-03-13T19:36:32.393 回答
-1

可以包括一个像这样的合并函数:

select distinct CAST( w.work_area AS CHAR(4) ) || s.code_id as WATT
from sys_code s, work_area_master w
where s.code_type = '590' 
and (CAST( w.work_area AS CHAR(4)) || s.code_id) in (
select substr(coalesce(misc_flags,"    "), 1,6)
from sys_code
where code_type = 'STA'
);
于 2013-03-13T18:24:18.350 回答