SQL запрос, который находит идентификатор, который не связан с другим идентификатором - PullRequest
2 голосов
/ 07 марта 2020

Я в настоящее время изучаю веревки SQL, и у меня есть учебное пособие из школы, которое выглядит следующим образом: Все магазины (storeid) продают (productid, storeid) некоторые продукты (productid). Магазин считается монополией, если каждый Продукт, который они продают, не продается ни в каком другом магазине. Как мне найти монополии? Я думал о выборе 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 считается монополией, поскольку они продают товары, которых нет в других магазинах.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Мы можем попробовать подход самостоятельного объединения в сочетании с агрегацией:

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 с другой строкой при условии, что это тот же продукт , но продается в другом магазине. Соответствующий магазин - это магазин, для которого ни один из его продуктов не продается другими магазинами, поэтому счетчик второго столбца таблицы в объединении должен быть равен нулю.

0 голосов
/ 07 марта 2020

Использовать оконные функции и агрегирование:

select s.storeid
from (select s.*,
             count(*) over (partition by productid) as num_stores
      from sells s
     ) s
group by s.storeid
having max(num_stores) = 1;

Это должно быть намного быстрее, чем самостоятельное объединение. Это также почти прямой перевод вашего вопроса. Подзапрос подсчитывает количество магазинов, в которых продается каждый товар. Внешний запрос выбирает магазины, в которых все товары продаются в одном магазине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...