如果在 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?
我在视图中使用联合并过滤掉所有具有 EQ
或 NECF
的项目,如下所示:
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';
我确实有记录!视图不应该过滤掉 EQ
或 NECF
。当我在视图上执行第二个 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
-- 查询在语义上是相同的(不同的别名没有任何改变)。
我在视图中使用联合并过滤掉所有具有 EQ
或 NECF
的项目,如下所示:
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';
我确实有记录!视图不应该过滤掉 EQ
或 NECF
。当我在视图上执行第二个 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
-- 查询在语义上是相同的(不同的别名没有任何改变)。