如何编写查询以提供三个表的结果,以便每个"行"只有一个结果?
表格是:
T1 (ID, name, IP)
T2 (ID, date_joined)
T3 (ID, address, date_modified)
关系是:
T1-T2 1:1
,T1-T3 1:M
- T3中每个ID可以有多个地址行。
我想要的是所有上述字段的用户列表,但是 IF 他们有一个地址,我只想记录一个(如果它是最新的基于T3的奖励将是奖励.date_modified)。
所以我应该准确地知道T1中的记录数量(在这种情况下碰巧等于T2)而不是更多。
我试过了:
select t.ID, t.name, t.IP, tt.ID, tt.date_joined, ttt.ID, ttt.address
from T1 t JOIN T2 tt ON (t.ID = tt.ID) JOIN T3 ttt ON (t.ID = ttt.ID)
LEFT,RIGHT,INNER等的所有明智组合都是我能想到的!由于T3
,我不断获得多个副本答案 0 :(得分:2)
此查询应该有效:
select
t1.ID, t1.name, t1.IP, t2.date_joined, t3x.address
from t1
join t2 on t1.ID = t2.id
left join (
select t3.*
from t3
join (
select id, max(date_modified) max_date
from t3
group by id
) max_t3 on t3.id = max_t3.id and t3.date_modified = max_t3.max_date
) t3x on t1.ID = t3x.id
首先在t1和t2之间进行正常连接,然后使用派生表(t3x)连接,该表是具有最新日期的t3行的集合。
答案 1 :(得分:1)
所以T2在这里实际上并不相关。您只需要一种从T1到T3加入的方式,每个T1行最多可以获得一个T3行。
这样做的一种方法是:
select
T1.*,
(select address from T3 where T3.ID=T1.ID order by date_modified desc limit 1)
from T1;
这可能非常有效,是一个相关的子查询,但您可能并不在意,具体取决于数据集的大小。
它也只适合从T3获得一列,所以如果你有地址,城市和州,你必须找出别的东西。
答案 2 :(得分:0)
您可以使用Top 1的子查询,这样您只能从T3获得一个结果
这是一个示例sql
select * into #T1 from(
select 1 ID
union select 2
union select 3) A
select * into #T2 from(
select 1 ID
union select 2
union select 3) A
select * into #T3 from(
select 1 ID, 'ABC' Address, getDate() dateModified
union select 1, 'DEF', getDate()
union select 3, 'GHI', getDate()) A
select *, (select top 1 Address from #T3 T3 where T3.ID= T1.ID order by datemodified desc) from #T1 T1
inner join #T2 T2 on T1.ID = T2.ID
奖励: - 您还可以通过dateModified desc添加订单以获取最新地址