SQL获得第一个完整行匹配子查询中的每个结果

时间:2012-07-12 11:50:17

标签: sql subquery

所以问题是这个。我有一个包含n列数据的表,但我想为每个唯一的3列列表列出一行。

例如,假设表的结构如下

ID | data1 | data2 | data3 | description | price | handler | creationTime | etc...

我正在尝试做的是使用这个子查询:

SELECT distinct data1, data2, data3 FROM Table_1

...获取3列的每个独特变体。但是我想从表格中为每个这样的结果选择一个完整的行。

此查询意味着相当繁重的使用,需要进行优化,这就是为什么我不能使用表变量或while循环的原因。任何提示?

3 个答案:

答案 0 :(得分:1)

我不认为你理解DISTINCT的概念。如果你有:

ID  data1  data2 data3 description1 price1
ID  data1  data2 data3 description2 price2

你期望结果如何? ID data1 data2 data3只返回一次,但是其他列中哪些内容与其他列相同?

你可以随时

select distinct ID,  data1,  data2, data3, MAX(description1), MAX(price1)

它会解析并给你一个结果,但它实际上没有多大意义......

答案 1 :(得分:1)

如果您使用的是SQL Server,则可以使用公用表表达式执行此操作:

with minRow(ID) as 
    (select min(ID)
    from    Table_1
    group by data1, data2, data3)
select  t1.*
from    Table_1 t1 join minRow m1 on t1.ID = m1.ID

答案 2 :(得分:1)

您需要的是Windows功能。以下是返回每个组中“第一”行的查询:

select t.*
from (select t.*,
             row_number() over (partition by data1, data2, data3
                                order by (select NULL)) as seqnum
      FROM Table_1 t
     ) t
where seqnum = 1

(这也包括最终的seqnum列,其中包含“1”。)

这个想法是为每一行提供一个序列号,然后取第一行。 “order by”子句是必需的。此查询中的语法只是在SQL Server中说“我不关心顺序”的有效方式 - 这在其他数据库中有所不同。