如果在 select 视图中添加 where/filter 子句,而该视图内部已经包含 where/filter 子句,会发生什么情况?

What happens when you add a where/filter clause on a select view when the view already contains the where/filter clause inside?

我在视图中使用联合并过滤掉所有具有 EQNECF 的项目,如下所示:

REPLACE VIEW X.VIEW_NAME
AS
LOCKING ROW FOR ACCESS
SELECT
*
FROM X.TABLENAME A
WHERE A.SIS <> 'EQ' OR A.SERVICE_NUMBER <> 'NECF'
UNION ALL
SELECT
*
FROM X.TABLENAME B
WHERE B.SIS <> 'EQ' OR B.SERVICE_NUMBER <> 'NECF';

现在,如果我再次过滤视图

SEL *
FROM X.VIEWNAME A
WHERE A.SIS = 'EQ' OR A.SERVICE_NUMBER = 'NECF';

我确实有记录!视图不应该过滤掉 EQNECF。当我在视图上执行第二个 select 查询时,我应该收到 0 条记录?

您的视图包含另一个您预期的视图。

...
WHERE A.SIS <> 'EQ'
       OR A.SERVICE_NUMBER <> 'NECF'
...
sis'EQ'service_number 不是 'NECF'

保留一行,当 service_number'NECF'sis 不是 EQ。请注意,您使用了 OR 运算符。如果要过滤掉 sis'EQ'service_number'NECF' 的任何行,则需要使用 AND:

...
WHERE A.SIS <> 'EQ'
      AND A.SERVICE_NUMBER <> 'NECF'
...

另请注意,您可以通过使用德摩根定律轻松地看到:
我们要过滤掉

处的行
sis = 'EQ'
 OR service_number = 'NECF'

这意味着我们要保留否定为真的行(在 WHERE 子句中)。否定是:

sis <> 'EQ'
 AND service_number <> 'NECF'

也就是运算符取反,把OR改成AND

同样有趣的是,您对同一组进行 UNION ALL -- 查询在语义上是相同的(不同的别名没有任何改变)。