1

问题是“查找至少具有属性 id 7 的所有仪表类型的属性 (pids)”

有一个名为 p__METER 的表,其中包含 id 和metertypes

所以这是我认为是正确的,但它不只返回具有两个值的 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 ))
4

3 回答 3

2

您需要一个双重嵌套查询

最好说“查找不缺少属性 id 7 具有的任何仪表类型的属性 (pids)”或

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

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))
于 2013-05-13T13:08:37.467 回答
2

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

所以你已经得到了最里面的查询。改变:

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

至:

       WHERE metertype = Y.metertype
       AND pid = X.pid ))
于 2013-05-13T12:54:04.993 回答
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
         )
于 2013-05-13T12:54:09.060 回答