有人可以给我正确的查询吗?
我有一个Item
有两列的表,ItemNo
并且AliasItemNo
.
我想写一个查询来只返回那些有多个别名的项目
我正在尝试执行
select ItemNo, AliasItemNo
from Item
group by ItemNo, AliasItemNo
having count(ItemNo) > 1
order by ItemNo Asc
此查询没有给出正确的结果。
请帮忙
有人可以给我正确的查询吗?
我有一个Item
有两列的表,ItemNo
并且AliasItemNo
.
我想写一个查询来只返回那些有多个别名的项目
我正在尝试执行
select ItemNo, AliasItemNo
from Item
group by ItemNo, AliasItemNo
having count(ItemNo) > 1
order by ItemNo Asc
此查询没有给出正确的结果。
请帮忙
带有计数的子查询是适用于所有 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 中,您还可以COUNT(*) OVER (PARTITION BY ItemNo)
在 CTE 中使用:
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;
这应该有效:
select ItemNo
from Item
group by ItemNo
having count(AliasItemNo) > 1
order by ItemNo Asc
您正在计算 ItemNo 而不是 AliasItemNo
有很多方法可以做到这一点。这里有几种方法。
--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