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场共(和打字他们都将是乏味!)

+0

感谢您的帮助大家!我有原型期限向前冲(两个月) - 这意味着我需要得到数据库的原型出来之前,我离开了我的假期......这是明天...... 我将要离开的分组的日期,直到我从我的假期回来 - 但在此期间,谢谢大家!当我回来的时候我会保证线程的安全! –

只是为了确保我有你要求的权利的一切,我要重申你的一些问题,然后回答。

你源表是这样的:

table_core:

table_core_output

table_dates:

table_dates_output

而且你的输出是这样的:

电流:

current_joined_output

期望:

desired_output

为了做到这一点,所有你需要做的是使用一个子查询(或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 
+0

除非table_CORE具有ID之外的其他字段,否则所陈述的数据是正确的;虽然我很确定你的代码在这种情况下仍然可以工作(我将在稍后确认,因为我已经被要求在明天结束之前冲出数据库的原型(它应该是一个两层结构)个月的项目...) –

+0

@ CallumP.Robertson它应该工作,无论有多少其他领域在/或者从表中选择好运气与原型 – tarheel

+0

我们走吧! - 设法与上述轻微变形修复代码!谢谢你!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] 

您的示例字段名称与示例查询不匹配,所以我猜测了一下。

+0

好点,谢谢Rich –

+0

也许值得使用表别名,他们没有明确的选择或分组。 –

+0

@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]