Использование констант с вычитанием с функцией Count в SQL - PullRequest
0 голосов
/ 18 июня 2019

Предположим, у нас есть схема для поставщиков, каталога и запасных частей, и мы пытаемся выяснить, какие поставщики поставляют все детали, кроме одной.

Это будет правильный запрос?Я не уверен только из-за того, что -1 в конце последнего оператора выбора, я не уверен, действительно ли это или нет.

SELECT S.sid 
FROM SUPPLIER S, CATALOGUE C
WHERE S.sid = C.sid
GROUP BY S.sid
HAVING COUNT(*) = ((SELECT COUNT(*) FROM PARTS) - 1))

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

Вы можете попробовать следующее с distinct предложением:

SELECT S.sid 
  FROM SUPPLIER S
  JOIN CATALOGUE C ON S.sid = C.sid
  JOIN PARTS P ON P.id = C.parts_id  
 GROUP BY S.sid
HAVING COUNT(distinct C.parts_id) = COUNT(distinct P.parts_id) - 1
0 голосов
/ 18 июня 2019

Вы, кажется, хотите:

SELECT c.sid 
FROM CATALOGUE c
GROUP BY c.sid
HAVING COUNT(*) = (SELECT COUNT(*) - 1 FROM PARTS)

Вам не нужна таблица SUPPLIERS, если вам нужен только идентификатор.

Полагаю, каталог мог содержать один и тот же товар несколько раз. Если это возможно, то вы хотите COUNT(DISTINCT):

SELECT c.sid 
FROM CATALOGUE c
GROUP BY c.sid
HAVING COUNT(DISTINCT c.<partid>) = (SELECT COUNT(*) - 1 FROM PARTS)

<partid> относится к любому столбцу с информацией о детали.

0 голосов
/ 18 июня 2019

должно быть выбрано count (*) -1

, но вы также должны избегать старого неявного синтаксиса для объединения, основанного на том, где и использовать явный синтаксис объединения

SELECT * 
FROM SUPPLIER S
INNER JOIN  CATALOGUE C ON S.sid = C.sid
GROUP BY S.sid
HAVING COUNT(*) = (
  SELECT COUNT(*) -1 FROM PARTS
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...