【问题标题】:What happens when you add a where/filter clause on a select view when the view already contains the where/filter clause inside?当视图中已经包含 where/filter 子句时,在选择视图上添加 where/filter 子句会发生什么?
【发布时间】:2021-09-19 06:55:09
【问题描述】:

我在视图中使用联合并过滤掉所有具有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。当我对视图进行第二次选择查询时,我应该收到 0 条记录?

【问题讨论】:

    标签: sql teradata teradatasql


    【解决方案1】:

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

    ...
    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 —— 从语义上讲,查询是相同的(不同的别名没有任何变化)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 2018-04-14
      • 2022-12-14
      • 2021-09-15
      相关资源
      最近更新 更多