1

大家早上好,为标题道歉......我在将问题简化为一行时遇到了麻烦。我的数据库平台是 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,我觉得必须有更好的方法。感谢你的协助。

4

2 回答 2

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
于 2013-07-20T07:44:49.333 回答
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
于 2013-07-19T17:08:07.603 回答