1

我想从我正在查询的数据库中选择不同或唯一的记录。我怎样才能做到这一点,但同时选择整个记录,而不仅仅是我区分为唯一的列?我必须做不守规矩的加入吗?

4

3 回答 3

5

根据您使用的数据库,您可以使用窗口函数。如果您只想要永不重复的行:

select t.*
from (select t.*,
             count(*) over (partition by <id>) as numdups
      from t
     ) t
where numdups = 1

如果您想要每一行的一个示例:

select t.*
from (select t.*,
             row_number(*) over (partition by <id> order by <id>) as seqnum
      from t
     ) t
where seqnum = 1

如果你没有窗口函数,你可以用“unruly joins”来完成同样的事情。

于 2012-06-25T17:29:48.633 回答
3

如果您只希望多列中的一列是唯一的并且您有可能包含多条记录的连接,那么您必须确定您希望查询提供的两个或多个值中的哪一个。这可以通过聚合函数、相关子查询或派生表或 CTE(在 SQL Server 中不确定 Oracle 是否有这些)来完成。

但是您必须在编写查询之前确定您想要的值。一旦你知道了,那么你可能知道如何得到它。

下面是一些简单的示例(我使用了 SQL Server 编码约定,但其中大部分在 Oracle 中应该是有意义的,因为它都是基本 SQL,Oracle 可能有不同的声明参数的方式):

select a.a_id, max (b.test) , min (c.test2)
from tablea a 
join tableb b on a.a_id = b.a_id
join tablec c on a.a_id = c.a_id
group by a.a_id
order by b.test, c.test2

Select a.a_id, (select top 1 b.test from tableb b where a.a_id = b.a_id order by test2),
(select top 1 b.test2 from tableb b where a.a_id = b.a_id order by test2),
(select top 1 c.test3 from tablec c where a.a_id = c.a_id order by test4)
from tablea a   

declare @a_id int
set @a_id = 189
select a.a_id , b.test, b.test4
from tablea a 
join tableb b on a.a_id = b.a_id
join (select min(b.b_id) from tableb b where b.a_id = @a_id order by b.test3) c on c.b_id = b.b_id
where a.a_id = @a_id
于 2012-06-25T17:10:07.800 回答
0

在第二个例子中


  select t.*
from (select t.*,
             row_number() over (partition by id order by id ) as seqnum
      from t
     ) t
where seqnum = 1

row_number() 必须在大括号中没有星号。

于 2017-07-19T14:26:47.623 回答