2013-04-05 2 views
0

У меня есть 3 таблицы категории продуктов и категории продуктов.проверить, существует ли значение столбца в подзапросе

Продукт таблице:

ProductID ProductName 
1    P1 
2    P2 
3    P3 

Категория стол:

CategoryID CategoryName 
1    C1 
2    C2 
3    C3 

ProductCategory:

ProductID CategoryID 
1   1 
1   2 
1   3 
2   3 
3   1 
3   2 

Мне нужен запрос, который возвращает продукты, которые подпадают под более чем 1 категории. На основании данных таблицы выше результат будет:

ProductID  ProductName 
    1    P1 
    3    P3 

Так я написал запрос, чтобы извлечь все ProductID, который имеет более чем один CategoryID как ниже:

select ProductID,count(CategoryID)  
from ProductCategory 
group by Productid 
having count(CategoryID)>1) 

Но когда я пытаюсь отобразить детали продукта, используя приведенный ниже запрос, я получаю ошибку:

select * 
from Product 
where ProductID in (
    select ProductID,count(CategoryID) 
    from ProductCategory 
    group by Productid 
    having count(CategoryID)>1)) 

Является ли мой запрос неправильным? Как получить требуемые сведения о продукте, которые попадают в более чем одну категорию?

ответ

4

Удалите COUNT() в подзапросе. Результат подзапроса при использовании в предложении IN должен иметь только один возвращаемый столбец.

SELECT * 
FROM Product 
WHERE ProductID IN 
     (
      SELECT ProductID 
      FROM ProductCategory 
      GROUP BY Productid 
      HAVING count(CategoryID) > 1 
     ) 

или с помощью JOIN

SELECT a.* 
FROM Product a 
     INNER JOIN 
     (
      SELECT ProductID 
      FROM ProductCategory 
      GROUP BY Productid 
      HAVING count(CategoryID) > 1 
     ) b ON a.ProductID = b.ProductID 
+0

Спасибо, что было очень полезно – Toni

+0

вы радушны ': d' –

0

Вы можете попробовать использовать CROSS ОТНОСИТЬСЯ оператор в SQL Server

SELECT DISTINCT C.ProductID,C.ProductName,A.CategoryID,A.Total 
FROM Product C 
CROSS APPLY (
    Select CA.CategoryID,Total=COUNT(*) 
    From ProductCategory CA 
    Where C.ProductID=CA.ProductID 
    Group By CA.CategoryID Having COUNT(*)>1 
) AS A 
ORDER BY A.Total DESC 

Посмотри: http://explainextended.com/2009/07/16/inner-join-vs-cross-apply/

If this solves your question, please mark as correct answer

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