代码之家  ›  专栏  ›  技术社区  ›  Chris Burgess

SQL,其中不包括使用和不使用的记录

  •  0
  • Chris Burgess  · 技术社区  · 15 年前

    以下是我正在处理的一个问题:

    SELECT  TBL_SUB_KEY AS port
          , poe.[TBL_COMPANY]
          , poe.[TBL_DIVISION_1]
    FROM    dbo.TMVKTAB AS poe
    WHERE   ( TBL_NUMBER = '8A' )
            AND ( TBL_SUB_KEY <> '' )
            AND ( poe.[TBL_COMPANY] <> '011'
                  AND poe.[TBL_DIVISION_1] <> '11'
                )
    

    我要退回的是 在公司中:='011'/部门中:'1'='11'。

    我原以为合并()中的公司/部门可以实现这一目标,但事实并非如此。它删除了公司所有的“011”记录,并删除了所有的“11”部门记录。

    但是,当我这样做时:

    SELECT  TBL_SUB_KEY AS port
          , poe.[TBL_COMPANY]
          , poe.[TBL_DIVISION_1]
    FROM    dbo.TMVKTAB AS poe
    WHERE   ( TBL_NUMBER = '8A' )
            AND ( TBL_SUB_KEY <> '' )
            AND NOT ( poe.[TBL_COMPANY] = '011'
                  AND poe.[TBL_DIVISION_1] = '11'
                )
    

    它似乎得到了正确的结果。为什么会这样?

    5 回复  |  直到 15 年前
        1
  •  5
  •   tekBlues    15 年前

    这是一个布尔逻辑问题:

    NOT (A and B) <=> NOT A  OR NOT B
    

    即。:

    NOT ( poe.[TBL_COMPANY] = '011' AND poe.[TBL_DIVISION_1] = '11')
    

    相当于:

    ( poe.[TBL_COMPANY] <> '011' OR poe.[TBL_DIVISION_1] <> '11')
    

    阅读:

    http://en.wikipedia.org/wiki/Boolean_logic

        2
  •  3
  •   Jose Basilio    15 年前

    我认为等同于不使用或如下所示:

    SELECT  TBL_SUB_KEY AS port
          , poe.[TBL_COMPANY]
          , poe.[TBL_DIVISION_1]
    FROM    dbo.TMVKTAB AS poe
    WHERE   ( TBL_NUMBER = '8A' )
            AND ( TBL_SUB_KEY <> '' )
            AND ( poe.[TBL_COMPANY] <> '011'
                  OR poe.[TBL_DIVISION_1] <> '11'
                )
    
        3
  •  2
  •   KM.    15 年前
    where x and (y and z)
    

    是一样的

    x and y and z
    

    然而

    where x and not (y and z)
    

    是你想要的,而且有效。

    试试这个:

    SELECT  TBL_SUB_KEY AS port
          , poe.[TBL_COMPANY]
          , poe.[TBL_DIVISION_1]
    FROM    dbo.TMVKTAB AS poe
    WHERE   ( TBL_NUMBER = '8A' )
            AND ( TBL_SUB_KEY <> '' )
            AND NOT ( poe.[TBL_COMPANY] = '011'
                      AND poe.[TBL_DIVISION_1] = '11'
                    )
    
        4
  •  1
  •   Guffa    15 年前

    是时候学习布尔代数了。这是:

    not (x and y)
    

    相同:

    (not x or not y)
    

    所以您的查询应该是:

    SELECT  TBL_SUB_KEY AS port
          , poe.[TBL_COMPANY]
          , poe.[TBL_DIVISION_1]
    FROM    dbo.TMVKTAB AS poe
    WHERE   ( TBL_NUMBER = '8A' )
            AND ( TBL_SUB_KEY <> '' )
            AND ( poe.[TBL_COMPANY] <> '011'
                  OR poe.[TBL_DIVISION_1] <> '11'
                )
    
        5
  •  0
  •   Vinko Vrsalovic    15 年前

    因为记录不属于 二者都 公司011和11区匹配

              poe.[TBL_COMPANY] <> '011'
              OR poe.[TBL_DIVISION_1] <> '11'
    

    如果Company不是011,则Division可以是11,并且您仍然有匹配的组合。

    De Morgan's law 解释如何以这种方式转换布尔表达式。