2

为什么我Jim在以下结果中得到重复?

CREATE TABLE #B (Name VARCHAR(10), Age INT)
INSERT INTO #B 
values 
('Jim', 21),
('Jim', 21),
('Jim', 19),
('Jim', 20),
('Nick', 20),
('Nick', 2),
('Nick', 20);


SELECT  DISTINCT
        Name,
        Age
FROM    #B A
WHERE   EXISTS
        (
        SELECT 1
        FROM #B B
        WHERE A.Age > B.Age
              AND A.NAME = B.NAME
        )
4

4 回答 4

3

因为你有 2 行对应?

A.Age > B.Age and a.name = b.name

所以

Jim 20 > Jim 19
Jim 21 > Jim 19 
Jim 21 > Jim 20 

有了不同的,你得到Jim 20 and Jim 21Jim 21合并为一个)

没有 EXISTS 的解决方案

select Name, Max(Age)
FROM #B
GROUP BY Name;
于 2013-09-06T15:49:43.580 回答
3

正如 SQL Fiddle 所示(此处),您的查询没有按照您的想法进行。

它不是获取max(),而是获取除最小值之外的所有内容。

此版本将获得max()

SELECT  DISTINCT
        Name,
        Age
FROM    B A
WHERE   NOT EXISTS
        (
        SELECT 1
        FROM B B
        WHERE A.Age < B.Age
              AND A.NAME = B.NAME
        );
于 2013-09-06T15:50:31.783 回答
2

如果您使用的是 SQL Server 2005 及更高版本,则使用如下所述的 CTE 将为您提供每个人的最大年龄:

drop table #B;
CREATE TABLE #B (Name![enter image description here][1] VARCHAR(10), Age INT)
INSERT INTO #B 
values 
('Jim', 21),
('Jim', 21),
('Jim', 19),
('Jim', 20),
('Nick', 20),
('Nick', 2),
('Nick', 20);

;with cte 
as (select Name, Age, ROW_NUMBER() over (PARTITION BY Name order by Name desc) as CNT
        from #B
        )
select Name, Age
from cte
where CNT = 1

在此处输入图像描述 结果 :

于 2013-09-06T16:03:34.453 回答
1

因为您已经告诉 DBMS 获取年龄低于一个人的最大年龄的所有行。

您获得 Jim 20 和 Jim 21 的行。

如果您想了解每个人的最大年龄,您必须:

SELECT distinct
    Name,
    Age
FROM    #B A
WHERE   not EXISTS
        (
        SELECT 1
        FROM #B B
        WHERE A.Age < B.Age
              AND A.NAME = B.NAME
        )

我在 EXISTS 之前添加了一个 NOT。

保持 DISTINCT,因为您有 2 行 (Jim, 21) 年龄相同

于 2013-09-06T15:49:11.623 回答