SQL加入一到多个表,只选择最近的条目
这是我的第一篇 - 所以我道歉,如果这是在错误的seciton!SQL加入一到多个表,只选择最近的条目
我使用的是它们各自的ID号将两个表有一个一对多的关系,但我只想要回最近的记录连接表,我不完全知道从哪里甚至开始!
我原来返回所有代码如下所示:
SELECT table_DATES.[date-ID], *
FROM table_CORE LEFT JOIN table_DATES ON [table_CORE].[core-ID] = table_DATES.[date-ID]
WHERE table_CORE.[core-ID] Like '*'
ORDER BY [table_CORE].[core-ID], [table_DATES].[iteration];
这将返回一组记录:显示table_CORE和table_DATES之间的每一个匹配ID:
table_CORE date-ID iteration
1 1 1
1 1 2
1 1 3
2 2 1
2 2 2
3 3 1
4 4 1
但我只需要返回在“迭代”字段中具有最大值的日期如下所示
table_CORE date-ID iteration Additional data
1 1 3 MoreInfo
2 2 2 MoreInfo
3 3 1 MoreInfo
4 4 1 MoreInfo
我真的不知道从哪里开始 - 显然这将是一些不大不小的连接查询 - 但我不知道怎么去子查询只返回最高迭代表2中的ID每个项目领域?
希望是有道理的 - 如果说到它,我会改写!
--edit-- 我想知道如何集成当我需要从表1(table_CORE在这种情况下)的所有字段和所有字段从table2(table_DATES)加入以及?
两个表都有,将需要合并的其他领域。
我敢肯定,我可以再补充领域进入“选择”和“GROUP BY”条款,但也有大约40场共(和打字他们都将是乏味!)
只是为了确保我有你要求的权利的一切,我要重申你的一些问题,然后回答。
你源表是这样的:
table_core:
table_dates:
而且你的输出是这样的:
电流:
期望:
为了做到这一点,所有你需要做的是使用一个子查询(或CTE)作为“交叉参考”表。 (我使用临时表来重新创建数据示例,_
代替列名中的-
)。
--Loading the example data
create table #table_core
(
core_id int not null
)
create table #table_dates
(
date_id int not null
, iteration int not null
, additional_data varchar(25) null
)
insert into #table_core values (1), (2), (3), (4)
insert into #table_dates values (1,1, 'More Info 1'),(1,2, 'More Info 2'),(1,3, 'More Info 3'),(2,1, 'More Info 4'),(2,2, 'More Info 5'),(3,1, 'More Info 6'),(4,1, 'More Info 7')
--select query needed for desired output (using a CTE)
; with iter_max as
(
select td.date_id
, max(td.iteration) as iteration_max
from #table_dates as td
group by td.date_id
)
select tc.*
, td.*
from #table_core as tc
left join iter_max as im on tc.core_id = im.date_id
inner join #table_dates as td on im.date_id = td.date_id
and im.iteration_max = td.iteration
除非table_CORE具有ID之外的其他字段,否则所陈述的数据是正确的;虽然我很确定你的代码在这种情况下仍然可以工作(我将在稍后确认,因为我已经被要求在明天结束之前冲出数据库的原型(它应该是一个两层结构)个月的项目...) –
@ CallumP.Robertson它应该工作,无论有多少其他领域在/或者从表中选择好运气与原型 – tarheel
我们走吧! - 设法与上述轻微变形修复代码!谢谢你!Ps - Prototype变得非常糟糕:他们认为这并不像他们认为的那么紧迫......现在我从假期回来了,但它又紧急! –
尝试像这样使用MAX聚合函数和GROUP BY子句。
SELECT
[ID1],
[ID2],
MAX([iteration])
FROM
table_CORE
LEFT JOIN table_DATES
ON [table_CORE].[core-ID] = table_DATES.[date-ID]
WHERE
table_CORE.[core-ID] Like '*' --LIKE '%something%' ??
GROUP BY
[ID1],
[ID2]
您的示例字段名称与示例查询不匹配,所以我猜测了一下。
好点,谢谢Rich –
也许值得使用表别名,他们没有明确的选择或分组。 –
@PaulAndrew洛尔 - 我忘了WHERE子句在那里 - 它是由VBA编译时的遗留问题。当我在两个表中包含其他字段(其中大约40个!)时,我正在努力使您的方法正常工作 - 更新原始问题以反映 –
select *
from
(
SELECT table_DATES.[date-ID], *
, row_number() over (partition by table_CORE date-ID order by iteration desc) as rn
FROM table_CORE
LEFT JOIN table_DATES
ON [table_CORE].[core-ID] = table_DATES.[date-ID]
WHERE table_CORE.[core-ID] Like '*'
) tt
where tt.rn = 1
ORDER BY [core-ID]
感谢您的帮助大家!我有原型期限向前冲(两个月) - 这意味着我需要得到数据库的原型出来之前,我离开了我的假期......这是明天...... 我将要离开的分组的日期,直到我从我的假期回来 - 但在此期间,谢谢大家!当我回来的时候我会保证线程的安全! –