我希望这个问题的答案与 DBMS 无关,但如果它是相关的,我正在使用 Access SQL。
请注意,这是我正在尝试做的简化版本。
现在,考虑我有以下三个表。
我的主要水果表(tblFruits):
╔═════════╦═══════════╦
║ fruitID ║ fruitName ║
╠═════════╬═══════════╬
║ 1 ║ Apple ║
║ 2 ║ Orange ║
║ 3 ║ Grapefruit║
╚═════════╩═══════════╩
将许多标签链接到 1 个水果的联结表(tblFruitTagJunc):
╔════════════════╦═════════╦═════════════╗
║ fruitTagJuncID ║ fruitID ║ tagID ║
╠════════════════╬═════════╬═════════════╣
║ 1 ║ 1 ║ 1 ║
║ 2 ║ 1 ║ 2 ║
║ 3 ║ 1 ║ 4 ║
║ 4 ║ 1 ║ 5 ║
║ 5 ║ 2 ║ 3 ║
║ 6 ║ 3 ║ 3 ║
║ 7 ║ 3 ║ 6 ║
╚════════════════╩═════════╩═════════════╝
最后是一个标签表来标记我的水果(tblTag):
╔═════════╦═══════════╗
║ tagID ║ tag ║
╠═════════╬═══════════╣
║ 1 ║ Tasty ║
║ 2 ║ Red ║
║ 3 ║ Orange ║
║ 4 ║ Shiny ║
║ 5 ║ Delicious ║
║ 6 ║ Awful ║
╚═════════╩═══════════╝
感谢这篇博文让我变得懒惰)
这实质上是说:
- 苹果是(红色,有光泽,美味,美味)
- 橙子是(橙子)
- 葡萄柚是(橙色,可怕)
现在说我想选择那些带有“橙色”标签的水果,而没有其他水果。有了所提供的数据,那将只是具有fruitName = 'Orange'
. 我目前正在这样做:
SELECT F.fruitName
FROM tblFruits F
INNER JOIN tblFruitTagJunc AS FTJ on F.fruitID = FTJ.fruitID
INNER JOIN tbltag as T ON FTJ.tagID = T.tagID
WHERE T.tag in('Orange')
GROUP BY F.fruitName
HAVING count(T.tag) = 1
这将在结果中返回橙色和葡萄柚,但我只想要橙色。
我以这种方式执行 SQL 语句的原因是不同类型的水果可能具有相同的名称但不同的标签,或者不同的水果可能只有一个相同的标签。
编辑: