2013-07-15 35 views
0

有人可以请给我正确的查询。SQL查询没有获取正确的结果

我有一个表Item与两列ItemNoAliasItemNo

我想编写一个查询只返回我那些有不止一个别名项目

我试图执行

select ItemNo, AliasItemNo 
from Item 
group by ItemNo, AliasItemNo 
having count(ItemNo) > 1 
order by ItemNo Asc 

这查询不给正确的结果。

请帮助

+0

有COUNT(*) – Paparazzi

回答

4

与计数的子查询的是,在所有RDBMS的工作方式:

SELECT ItemNo, AliasItemNo FROM Item i1 
WHERE (SELECT COUNT(*) FROM Item i2 WHERE i1.ItemNo=i2.ItemNo) > 1 
ORDER BY ItemNo Asc 

在SQL-服务器> = 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; 

演示:http://sqlfiddle.com/#!6/78d9c/9/1

0

有很多w的ays要做到这一点。这有几种方法。


--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 

2

这应该工作:

select ItemNo 
from Item 
group by ItemNo 
having count(AliasItemNo) > 1 
order by ItemNo Asc 

你指望货号,而不是AliasItemNo