我有一个数据库(NexusDB (假定符合SQL-92 )),其中包含一个项目表、一个类别表和一个多对多ItemCategory表,这只是一对键。正如您可能期望的那样,项目被分配到多个类别。
我希望所有的最终用户选择所有的项目是
ItemID | CategoryID
01 | 01
01 | 02
01 | 12
02 | 01
02 | 02
02 | 47
03 | 01
03 | 02
03 | 14
等等。
我希望能够选择分配给类别X、Y和Z但没有分配到类别P和Q的所有ItemID。
例如,对于上面的示例数据,假设我想获取分配给类别01或02但不是12的所有项(产生项02和03)。大致是这样的:
SELECT ItemID WHERE (CategoryID IN (01,02))
从集合中删除SELECT ItemID WHERE NOT (CategoryID = 12)
这可能是一个非常基本的SQL问题,但现在它把我难住了。如有任何帮助,敬请惠顾。
发布于 2008-12-13 09:52:12
您可以尝试使用EXCEPT
SELECT ItemID FROM Table
EXCEPT
SELECT ItemID FROM Table
WHERE
CategoryID <> 12发布于 2008-12-13 17:50:03
我希望能够选择分配给类别X、Y和Z但没有分配给类别P和Q的所有ItemID。
我无法从SELECT上的NexusDB文档中确认它们是否支持子查询,但它们确实支持LEFT OUTER JOIN和GROUP BY。因此,下面是一个在这些限制下工作的查询:
SELECT i1.ItemID
FROM ItemCategory i1
LEFT OUTER JOIN ItemCategory i2
ON (i1.ItemID = i2.ItemID AND i2.CategoryID IN ('P', 'Q'))
WHERE i1.CategoryID IN ('X', 'Y', 'Z')
AND i2.ItemID IS NULL
GROUP BY i1.ItemID
HAVING COUNT(i1.CategoryID) = 3;发布于 2008-12-13 09:55:46
SELECT i.ItemID, ic.CategoryID FROM Item AS i
INNER JOIN ItemCategory ic
ON i.ItemID = ic.ItemID
WHERE ic.CategoryId = 1 OR ic.CategoryId = 2当然,您需要在WHERE子句中输入您想要获取的类别。
https://stackoverflow.com/questions/365045
复制相似问题