首页 > 解决方案 > 需要在 sql server 中返回一个有 start 和 END 的 ID

问题描述

我有一个场景,我需要找到其中只有 start 和 END 的 ID。以下是供参考的表格。

Declare @T Table ( ID int, Name varchar(100))

Insert into @T values (1,'Start')
Insert into @T values (1,'END')
Insert into @T values (1,'Stuart')
Insert into @T values (1,'robin')
Insert into @T values (2,'Start')
Insert into @T values (2,'END')
Insert into @T values (3,'Start')
Insert into @T values (4,'END')

我希望输出为:

ID 名称
2 开始
2 结束

我想要那些只有开始和结束的ID。

到目前为止我尝试了什么:

SELECT * FROM @T t 
WHERE EXISTS (SELECT * FROM @T WHERE id = t.id AND name = 'start')
AND EXISTS (SELECT * FROM @T WHERE id = t.id AND name = 'END')

但我的查询也给出了 ID 1。

有人可以帮我解决这个问题。

标签: sqlsql-serversql-server-2008

解决方案


我想你的问题是记录 1 也有一个“斯图尔特”吗?

因此,您可以在 WHERE 中进行类似的检查,例如,

SELECT * FROM @T t 
WHERE EXISTS (SELECT * FROM @T WHERE id = t.id AND name = 'start')
AND EXISTS (SELECT * FROM @T WHERE id = t.id AND name = 'END')
AND NOT EXISTS (SELECT * FROM @T WHERE id = t.id AND name NOT IN ('start','END'))

请注意,您可能需要考虑

  • 如果您有两个“开始”行或两个“结束”行(例如,开始-开始-结束),会发生什么?您甚至可以有两个“开始”行(例如,开始-开始)吗?
  • 如果你有一个空白/NULL(例如,start-NULL-end)会发生什么?

编辑:删除“如果它们出现故障会发生什么(例如,结束开始)?” 作为一个问题,因为数据中根本没有排序(例如,甚至没有隐式排序)。


推荐阅读