首页 > 解决方案 > 查找未与另一个 id 关联的 id 的 SQL 查询

问题描述

我目前正在学习 SQL 的技巧,并且我有一个学校的教程是这样的:所有商店 (storeid) 销售 (productid, storeid) 一些产品 (productid) 如果商店销售的每件产品都不是由任何其他商店出售。如何找到垄断?我正在考虑从 2 个相同的表中选择 storeid,但我不确定如何从那里继续。

表格如下:

店铺:

+-----------+
|  storeid  |
+-----------+
| --------- |
|     1     |
|     2     |
|     3     |
|     4     |
|     5     |
+-----------+

产品:

+-------------+
|  productid  |
+-------------+
| ---------   |
|     1       |
|     2       |
|     3       |
|     4       |
|     5       |
|     6       |
+-------------+

销售:

+--------------------------+
|   productid | storeid    |
+--------------------------+
| -----------+------------ |
|          1 |          1  |
|          2 |          1  |
|          2 |          2  |
|          3 |          2  |
|          1 |          2  |
|          3 |          3  |
|          2 |          4  |
|          4 |          4  |
|          5 |          5  |
|          6 |          5  |
+--------------------------+

所以根据我的统计,只有 5 号商店被认为是垄断的,因为他们销售的产品在其他商店没有。

标签: mysqlsqlpostgresql

解决方案


我们可以尝试结合聚合的自连接方法:

SELECT t1.storeid
FROM yourTable t1
LEFT JOIN yourTable t2
    ON t2.productid = t1.productid AND
       t2.store_id <> t1.storeid
GROUP BY t1.storeid
HAVING COUNT(t2.storeid) = 0;

这里的方法是尝试将每一行Sells与其他行匹配,条件是它是相同的产品,但正在由其他商店出售。匹配的商店是其产品没有被其他商店出售的商店,因此连接中第二个表列的计数应该为零。


推荐阅读