获取与特定项目集相关的ID,但不包括其他项目

时间:2013-07-19 17:04:49

标签: sql teradata

早上好,为标题道歉......我无法将问题简化为一条线。我的数据库平台是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,我觉得必须有一个更好的方法。谢谢你的协助。

2 个答案:

答案 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