早上好,为标题道歉......我无法将问题简化为一条线。我的数据库平台是Teradata。
我正在使用如下表格(让我们称之为“t1”)
+------------+----------------------------------------+
| Service_Id | Product |
+------------+----------------------------------------+
| 1 | Traffic |
| 1 | Weather |
| 1 | Travel |
| 1 | Audio |
| 1 | Audio Add-on |
| 2 | Traffic |
| 2 | Weather |
| 2 | Travel |
+------------+----------------------------------------+
我正在尝试选择与以下产品相关的service_id以及以下产品:交通,天气,旅行
“Service_Id = 1”在这里不适用,因为虽然它有所需的产品,但它还有一个与之相关的“音频”产品......所以我们不得不把它留下来。我能够通过一系列临时(易变)表成功地做到这一点,但它感觉非常hacky,我觉得必须有一个更好的方法。谢谢你的协助。
答案 0 :(得分:2)
我在训练班中使用比萨做这样的事情(找到一组行的子集/超集/完全匹配): - )
有多种方法可以获得结果,但对于完全匹配,最简单的方法是使用以下逻辑的SUM:
SELECT service_id
FROM t1
GROUP BY 1
HAVING
SUM(CASE WHEN Product IN ('Traffic', 'Weather', 'Travel') THEN 1 ELSE -1 END = 3
答案 1 :(得分:1)
假设Product
对于每个service_ID
都是唯一的。
SELECT service_ID
FROM tableName a
WHERE Product IN ('Traffic', 'Weather', 'Travel') AND
EXISTS
(
SELECT 1
FROM tableName b
WHERE a.Service_ID = b.Service_ID
GROUP BY b.Service_ID
HAVING COUNT(*) = 3 -- <<== total number of products
)
GROUP BY service_ID
HAVING COUNT(*) = 3 -- <<== total number of products