有人可以给我正确的查询。
我有一个表Item
,其中包含两列ItemNo
和AliasItemNo
。
我想编写一个查询,只返回那些具有多个别名的项目
我正在尝试执行
select ItemNo, AliasItemNo
from Item
group by ItemNo, AliasItemNo
having count(ItemNo) > 1
order by ItemNo Asc
此查询未提供正确的结果。
请帮忙
答案 0 :(得分:4)
带有count的子查询是适用于所有rdbms的方式:
SELECT ItemNo, AliasItemNo FROM Item i1
WHERE (SELECT COUNT(*) FROM Item i2 WHERE i1.ItemNo=i2.ItemNo) > 1
ORDER BY ItemNo Asc
在SQL-Server> = 2005中,您还可以在CTE中使用COUNT(*) OVER (PARTITION BY ItemNo)
:
WITH CTE AS(
SELECT ItemNo,AliasItemNo,
Num=COUNT(*) OVER (PARTITION BY ItemNo)
FROM Item)
SELECT ItemNo, AliasItemNo FROM CTE
WHERE Num > 1
ORDER BY ItemNo Asc;
答案 1 :(得分:2)
这应该有效:
select ItemNo
from Item
group by ItemNo
having count(AliasItemNo) > 1
order by ItemNo Asc
您正在计算ItemNo而不是AliasItemNo
答案 2 :(得分:0)
有很多方法可以做到这一点。这有几种方法。
--using a sub query
SELECT
ItemNo,
AliasItemNo
FROM
Item INNER JOIN
(
SELECT
ItemNo
GROUP BY
ItemNo
HAVING
COUNT(AliasItemNo) > 1)
AS dupes
ON
Item.ItemNo = dupes.ItemNo
ORDER BY
Item.ItemNo ASC
--using CTE
;WITH
dupes AS
(
SELECT
ItemNo
GROUP BY
ItemNo
HAVING
COUNT(AliasItemNo) > 1
)
SELECT
ItemNo,
AliasItemNo
FROM
Item INNER JOIN dupes
ON
Item.ItemNo = dupes.ItemNo
ORDER BY
Item.ItemNo ASC