我的查询是:
SELECT DISTINCT a.field1, a.field2, a.field3, b.field1, b.field2, a.field4
FROM table1 a
JOIN table2 b ON b.fielda = a.fieldb
WHERE a.field1 = 'xxxx'
我运行它并返回三个xxxx行。我需要上面列出的所有信息,第一个字段是不同的。我有正确的语法吗?
答案 0 :(得分:1)
在Postgres中,您可以使用distinct on
:
select distinct on (a.field1) a.field1, a.field2, a.field3, b.field1, b.field2, a.field4
from table1 a join
table2 b
on b.fielda = a.fieldb
where a.field1 = 'xxxx'
order by a.field1;
在Postgres或SQL Server中,您可以使用row_number()
:
select ab.*
from (select a.field1, a.field2, a.field3, b.field1, b.field2, a.field4,
row_number() over (partition by a.field1 order by a.field1) as seqnum
from table1 a join
table2 b
on b.fielda = a.fieldb
where a.field1 = 'xxxx'
) ab
where seqnum = 1;
或者,由于您只需要一行,因此可以使用limit
/ top
:
select a.field1, a.field2, a.field3, b.field1, b.field2, a.field4
from table1 a join
table2 b
on b.fielda = a.fieldb
where a.field1 = 'xxxx'
limit 1;
在SQL Server中:
select top 1 a.field1, a.field2, a.field3, b.field1, b.field2, a.field4
from table1 a join
table2 b
on b.fielda = a.fieldb
where a.field1 = 'xxxx';
答案 1 :(得分:0)
一种选择是使用row_number()
:
with cte as (
select distinct a.field1, a.field2, a.field3, b.field1, b.field2, a.field4,
row_number() over (partition by a.field1 order by a.field1) rn
from table1 a
join table2 b on b.fielda = a.fieldb
where a.field1 = 'xxxx'
)
select *
from cte
where rn = 1
但您需要定义要采用的记录。此订单按field1
排序,基本上会随机记录......
答案 2 :(得分:0)
正如您可以从您的评论中读到的,DISTINCT无法为您效劳。它为您提供了不同的行。你需要的是一个聚合,以便从三个记录到一个记录。
所以你得到的第一条评论(由sgeddes提供)已经是你需要的答案:“其他专栏应该有什么价值?”。 dbms如何知道?你没有告诉它。
每个字段1一行通常表示GROUP BY字段1。然后对于每个其他字段决定你想看到什么:field2的最大值可能是多少? field3的最小值? field4的平均值?
select a.field1, max(a.field2), min(a.field3), count(b.field1), sum(b.field2), avg(a.field4)
from table1 a
join table2 b on b.fielda = a.fieldb
where a.field1 = 'xxxx'
group by a.field1;