Sql server SQL:如何在一个select语句中返回20列,并且只在一列上有一个unique?
我有一个巨大的select语句,包含多个内部连接,它返回了20列信息 是否有某种方法可以过滤结果,仅基于单个列执行唯一(或独特)操作 另一种思考方式是,当它进行连接时,它只在单个ID上获取连接的第一个结果,然后它停止并通过下一个ID进行连接 我已经成功地使用了Sql server SQL:如何在一个select语句中返回20列,并且只在一列上有一个unique?,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有一个巨大的select语句,包含多个内部连接,它返回了20列信息 是否有某种方法可以过滤结果,仅基于单个列执行唯一(或独特)操作 另一种思考方式是,当它进行连接时,它只在单个ID上获取连接的第一个结果,然后它停止并通过下一个ID进行连接 我已经成功地使用了groupby和distinct,但这需要您指定许多列,而不仅仅是一列,这似乎会使查询速度降低一个数量级 更新 @Martin Smith的答案非常有效 当我更新查询以使用此技术时: 它的速度增加了一倍多(1663毫秒降至740毫秒) 它
groupby
和distinct
,但这需要您指定许多列,而不仅仅是一列,这似乎会使查询速度降低一个数量级
更新
@Martin Smith的答案非常有效
当我更新查询以使用此技术时:
- 它的速度增加了一倍多(1663毫秒降至740毫秒)
- 它使用更少的T-SQL代码(无需向
子句添加大量参数)GROUPBY
- 它更易于维护
这不是分组依据的问题,因为TSQL语法分析器将防止这种情况发生,即,它只允许您在不可能重复的情况下返回结果。您可以使用
行数
WITH T AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY YourCol ORDER BY YourOtherCol) AS RN,
--Rest of your query here
)
SELECT *
FROM T
WHERE RN=1
我不明白你在问什么。如果您选择了20个不同的列,比如名字、姓氏、街道等,那么您当然会得到20个列。还有什么?听起来你好像不知道如何使用分组方式,但那只是猜测而已。你想达到什么目标?请向我们展示一些示例数据,您现在得到了什么以及您想要得到什么。返回哪一行是任意的还是您想要某一行?我的查询是,如果在
之前有任何重复的行与不同,它们将是相同的,因此返回哪一行并不重要@马丁·史密斯有一个答案,看起来它会完美地工作。@Thorsten Kettner。为了澄清这一点,我确实成功地使用了groupby
,但它将查询速度降低了一个数量级。我更新了我的问题以澄清这一点。马丁·史密斯的答案看起来很完美,效果很好。它比使用groupby
(1663ms比740ms)的等效查询快两倍多,使用更少的SQL代码,并且更易于维护。然而,有一个很小的警告,我已经编辑了我的原始问题来说明这一点。