0

我有简单的 SQL Server 查询:

declare @table table (id int, name nvarchar(5), deleted bit)

insert into @table(id, name, deleted) values(1, 'A1', 0)
insert into @table(id, name, deleted) values(2, 'A1', 0)
insert into @table(id, name, deleted) values(3, 'A1', 0)
insert into @table(id, name, deleted) values(4, 'A1', 1)
insert into @table(id, name, deleted) values(5, 'A2', 0)
insert into @table(id, name, deleted) values(6, 'A2', 0)

select
    max(id) as id,
    name
from @table
where deleted = 0
group by name

它返回到行

id  |name
--------------
3   |A1
6   |A2

但应该只返回一个

id  |name
-------------- 
6   |A2

因为 A1 的最后一个(或最大)id 被删除。

如何修复我的查询。

非常感谢。

4

2 回答 2

3

因为你可以有这样的第三组:

insert into @table(id, name, deleted) values(7, 'A3', 1)
insert into @table(id, name, deleted) values(8, 'A3', 0)

我假设您也希望返回以下内容,因为该名称的最高 id标记为已删除:

id    name
----  ----
8     A3

然后这个查询应该这样做:

;WITH x AS 
(
  SELECT id, name, deleted, 
    rn = ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC)
  FROM @table
)
SELECT id = MAX(id), name 
FROM x
WHERE NOT EXISTS
(
  SELECT 1 FROM x AS x2 
  WHERE name = x.name 
  AND deleted = 1 AND rn = 1
)
GROUP BY name;

如果您只希望在没有删除特定名称的行的情况下返回行,那么它会稍微简单一些:

SELECT id = MAX(id), name
FROM @table AS t
WHERE NOT EXISTS 
(
  SELECT 1 FROM @table 
  WHERE name = t.name AND deleted = 1
)
GROUP BY name;
于 2012-08-15T13:43:02.527 回答
1

另一种方法:http ://www.sqlfiddle.com/#!3/697d7/5

create table t(id int, name nvarchar(5), deleted bit)

insert into t(id, name, deleted) values(1, 'A1', 0)
insert into t(id, name, deleted) values(2, 'A1', 0)
insert into t(id, name, deleted) values(3, 'A1', 0)
insert into t(id, name, deleted) values(4, 'A1', 1)
insert into t(id, name, deleted) values(5, 'A2', 0)
insert into t(id, name, deleted) values(6, 'A2', 0)


with no_deletions as
(
  select name
  from t
  group by name
  having max(nullif(cast(deleted as int),0)) is null
)
select    
    max(id) as id,
    name    
from t
where name in (select name from no_deletions)
group by name

输出:

| ID | NAME |
-------------
|  6 |   A2 |
于 2012-08-15T13:58:54.347 回答