Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL:如何在一个select语句中返回20列,并且只在一列上有一个unique?_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server SQL:如何在一个select语句中返回20列,并且只在一列上有一个unique?

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毫秒) 它

我有一个巨大的select语句,包含多个内部连接,它返回了20列信息

是否有某种方法可以过滤结果,仅基于单个列执行唯一(或独特)操作

另一种思考方式是,当它进行连接时,它只在单个ID上获取连接的第一个结果,然后它停止并通过下一个ID进行连接

我已经成功地使用了
groupby
distinct
,但这需要您指定许多列,而不仅仅是一列,这似乎会使查询速度降低一个数量级

更新

@Martin Smith的答案非常有效

当我更新查询以使用此技术时:

  • 它的速度增加了一倍多(1663毫秒降至740毫秒)
  • 它使用更少的T-SQL代码(无需向
    GROUPBY
    子句添加大量参数)
  • 它更易于维护
警告(非常轻微)

请注意,如果您完全确定要删除的行始终是重复的,或者此查询将是不确定的(即,它可能会在不同的运行中返回不同的结果),则只应使用@Martin Smith的答案


这不是分组依据的问题,因为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代码,并且更易于维护。然而,有一个很小的警告,我已经编辑了我的原始问题来说明这一点。