SQL возвращает строки, где количество детей не равно значению столбца - PullRequest
2 голосов
/ 14 декабря 2009

У меня есть таблица Item с столбцами ItemID (PK), ItemName, ExpectedSubItems и другая таблица с именем SubItem с столбцами SubItemID (PK), ItemID (FK), SubItemName.

Я хочу вернуть все строки из Item, где число подэлементов отличается от ExpectedSubItems.

Я пытался использовать что-то вроде: -

Select * From Item
Join SubItem on Item.ItemID = SubItem.ItemID
Where ExpectedSubItems = Count(SubItem.ItemID)

но это дает мне ошибку: -

Совокупность может не отображаться в ГДЕ пункт, если он не находится в подзапрос, содержащийся в предложении HAVING или список выбора, а столбец агрегированный является внешней ссылкой.

Есть идеи от гуру SQL?

Ответы [ 5 ]

3 голосов
/ 14 декабря 2009

вам нужен подзапрос

select *
  from item
  where expectedsubtems <> (
    select count(*)
      from subitem
      where subitem.itemid = item.itemid
    )
1 голос
/ 14 декабря 2009
SELECT  ItemID
FROM    Item
JOIN    SubItem
ON      SubItem.ItemID = Item.ItemID
GROUP BY
        ItemID, ExpectedSubItems 
HAVING  ExpectedSubItems <> COUNT(*)

или это (чтобы вам не приходилось группировать по всем Item полям, что также работает для 0 ожидаемых подпунктов)

SELECT  Item.*
FROM    Item
CROSS APPLY
        (
        SELECT  NULL
        FROM    SubItem
        WHERE   SubItem.ItemID = Item.ItemID
        HAVING  ExpectedSubItems <> COUNT(*)
        ) S
1 голос
/ 14 декабря 2009

Это должно сделать это:

SELECT
     I.item_id,
     I.item_name,
     I.expected_subitems
FROM
     Items I
LEFT OUTER JOIN Sub_Items SI ON
     SI.item_id = I.item_id
GROUP BY
     I.item_id,
     I.item_name,
     I.expected_subitems
HAVING
     COUNT(SI.item_id) <> I.expected_subitems
1 голос
/ 14 декабря 2009

попробовать:

Select i.ItemId, i.ItemName
From Item i
  Left Join SubItem s
     On s.ItemID  = i.ItemId
Group By i.ItemId, i.ItemName, i.ExpectedSubItems
Having Count(*) <> i.ExpectedSubitems
0 голосов
/ 14 декабря 2009

Попробуйте следующее:

select *
  from Item I
  LEFT OUTER JOIN (select ItemID, COUNT(*) as ActualSubItemCount
                     from SubItem
                     group by ItemID) S
    ON (I.ItemID = S.ItemID)
  where (S.ItemID IS NULL AND NVL(I.ExpectedSubItems, 0) <> 0) OR
        I.ExpectedSubItems <> S.ActualSubItemCount;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...