SQL双重否定,我只是无法理解它。

时间:2013-05-13 12:47:34

标签: sql

问题是"找到至少具有所有仪表类型的属性(pids),因为属性ID 7具有"

这是一张包含id' s和metertypes的表格,名为p__METER

这就是我认为是正确的,但它不会返回具有两个值的pid,它还返回一个只有一个值以及原始属性的pid。有什么想法吗?这种双重否定的东西很难理解。

    SELECT DISTINCT pid
    FROM property__PROPERTYMETER X
    WHERE NOT EXISTS
         (SELECT * FROM property__PROPERTYMETER Y
         WHERE pid = 7
         AND NOT EXISTS
           (SELECT * FROM property__PROPERTYMETER
           WHERE metertype = X.metertype
           AND pid = Y.pid ))

3 个答案:

答案 0 :(得分:2)

最里面的查询应该验证最外层属性是否具有middle属性的所有metertype。在您的示例中,它验证中间属性没有外部属性的metertype。

所以你内心深处有一个最里面的查询。变化:

       WHERE metertype = X.metertype
       AND pid = X.pid ))

要:

       WHERE metertype = Y.metertype
       AND pid = X.pid ))

答案 1 :(得分:2)

您需要一个双重嵌套查询

更好的说法 “找到不属于任何属性ID 7所具有的仪表类型的属性(pids)” 或

“查找属性(pids),使得不存在属于pid 7且不属于此pid的metertype。”

Select DISTINCT pid           -- outer query: "Show all pids ... "
From property_PROPERTYMETER X 
Where not Exists                  -- mid-query: "Where there is no pid:7 metertype ..."
   (Select * From property_PROPERTYMETER y   
    Where metertype = X.metertype 
      And pid = 7
      And Not exists 
         (Select * from property_PROPERTYMETER -- inner Qry: "..not also in this pid."
          Where metertype = y.metertype 
            And pid = x.pid))

答案 2 :(得分:0)

左连接怎么样?

  SELECT DISTINCT pid
    FROM property__PROPERTYMETER X
    WHERE NOT EXISTS
         (SELECT * FROM property__PROPERTYMETER Y
         LEFT JOIN property__PROPERTYMETER Z 
              ON Z.metertype = Y.metertype AND Z.pid = X.pid
         WHERE Y.pid = 7 AND Z.pid is null
         )