2017-01-15 3 views
1

возникают проблемы с SQL-заявлением для отображения компаний, которые не поставляют напитки. Теперь проблема в том, что есть несколько компаний, которые поставляют как напиток, так и другие вещи. Мне нужно, чтобы они отображали только компании, которые вообще не поставляют напитки. Когда я запускаю измененный оператор SQL, мне удалось получить то, что я хочу, но для тех компаний, которые поставляют продукты, а также напитки, он все еще отображается из-за моего предложения WHERE, которое я установил для поиска C.CategoryName != 'Beverages'. Я просто хочу удалить те компании, которые поставляют как напитки, так и продукты, поэтому я могу отображать только те компании, которые поставляют только только продуктов.Показать только Компании, которые не предоставляют «Напитки» в Microsoft SQL

Извините, если у меня есть какая-то ошибка грамматиста или что-то еще, или мой вопрос неясен. Я просто не знаю, как объяснить профессионально, так как трудно описать мою проблему. Спасибо за тех, кто хочет помочь мне, я очень ценю это. А также я не знаю, достаточна ли эта информация и исходные коды для моей проблемы. При необходимости предоставит больше информации/исходный код.

Фотографии Обе категории & Таблица продуктов.

Категория Таблица dbo.Category

продукты Таблица dbo.Products

Вот изначальное утверждение

SELECT P.ProductName 
FROM Products AS P 
INNER JOIN 
Categories AS C 
ON 
C.CategoryID = P.CategoryID 
AND C.CategoryName = 'Beverages' 

Результат

This only displayed all beverages from the 'products' table.

До сих пор здесь модифицированное заявление

SELECT S.CompanyName, P.CategoryID, C.CategoryID FROM Suppliers AS S 
INNER JOIN 
Products AS P 
ON S.SupplierID = P.SupplierID 
LEFT OUTER JOIN 
Categories AS C 
ON 
C.CategoryID = P.CategoryID 
AND C.CategoryName != 'Beverages' 

Результат

enter image description here

+1

Если у вас есть выбор, который возвращает все компании и другой выбор, который возвращает компании, которые поставляют напитки, вы можете использовать 'EXCEPT' –

+0

Спасибо, ответьте мне, действительно помогите мне .. Я боролся с этим в течение нескольких дней, пока вы не пришел на помощь .. очень ценю это человек !! – Jatiz

ответ

0

Ответ Предложил Martin Smith.

С добавлением предложения EXCEPT в инструкцию SQL к моему измененному оператору SQL мне удалось это сделать. Вот ответ на мою проблему.

SELECT S.CompanyName FROM Suppliers AS S 
EXCEPT 
SELECT S.CompanyName FROM Suppliers AS S 
INNER JOIN 
Products AS P 
ON S.SupplierID = P.SupplierID 
RIGHT JOIN 
Categories AS C 
ON 
C.CategoryID = P.CategoryID 
AND C.CategoryName = 'Beverages' 
+0

Хороший подход на основе набора, но имейте в виду, что оператор EXCEPT в SQL Server очень дорого стоит вычислить, поэтому используйте его только в том случае, если ваш набор данных останется небольшим, и вы не возражаете против его пережевывания некоторых ресурсов. – evilhomer

0
WITH FOODSUPPLIERS AS 
(
    SELECT DISTINCT SUPPLIERID 
    FROM PRODUCTS P 
    JOIN CATEGORY C ON C.CATEGORYID = P.CATEGORYID 
    WHERE CATEGORYNAME <> 'Beverages' 
) 
SELECT S.COMPANYNAME FROM SUPPLIERS S 
JOIN FOODSUPPLIERS FS ON FS.SUPPLIERID = S.SUPPLIERID 

FOODSUPPLIERS КТР идентифицирует поставщиков в продуктах, которые не связаны с какими-либо продуктами напитка, то есть, связанных только с пищевыми продуктами. Тогда просто перейти к CTE поставщикам, чтобы получить записи для этих поставщиков.

Смежные вопросы