2016-06-07 58 views
2

這是我的第一篇 - 所以我道歉,如果這是在錯誤的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

感謝您的幫助大家!我有原型期限向前衝(兩個月) - 這意味着我需要得到數據庫的原型出來之前,我離開了我的假期......這是明天...... 我將要離開的分組的日期,直到我從我的假期回來 - 但在此期間,謝謝大家!當我回來的時候我會保證線程的安全! –

回答

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變得非常糟糕:他們認爲這並不像他們認爲的那麼緊迫......現在我從假期回來了,但它又緊急! –

2

嘗試像這樣使用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個!)時,我正在努力使您的方法正常工作 - 更新原始問題以反映 –

0
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] 
相關問題