过滤一组记录

时间:2014-03-06 17:09:01

标签: sql sql-server

请参阅下面的SQL结构:

CREATE table TestTable (id int not null identity, [type] char(1), groupid int)

INSERT INTO TestTable ([type]) values ('a',1)
INSERT INTO TestTable ([type]) values ('a',1)
INSERT INTO TestTable ([type]) values ('b',1)
INSERT INTO TestTable ([type]) values ('b',1)
INSERT INTO TestTable ([type]) values ('a',2)
INSERT INTO TestTable ([type]) values ('a',2)

前四个记录是第1组的一部分,第五和第六个记录是第2组的一部分。

如果组中至少有一个b,那么我希望查询只返回该组的b。如果没有b,则查询应该返回该组的所有记录。

1 个答案:

答案 0 :(得分:3)

你去吧

SELECT *
FROM testtable
LEFT JOIN (SELECT distinct groupid FROM TestTable WHERE type = 'b'
) blist ON blist.groupid = testtable.groupid
WHERE (blist.groupid = testtable.groupid and type = 'b') OR
      (blist.groupid is null)

工作原理

  • 加入包含b。

  • 的项目列表
  • 然后在where语句中......如果我们存在于该列表中,则只需要输入类型b。否则就拿一切。


作为一个后记,你可以很喜欢这个

的where子句
WHERE ISNULL(blist.groupid,testtable.groupid) = testtable.groupid

我认为这不太清楚 - 但往往是高级用户会这样做。