2014-03-31 75 views
1

我想加入兩個表,但只顯示唯一行和最新日期。加入兩個表,只顯示唯一值和最大日期

在線觀看我發現了各種方法來實現或連接兩個表格,或者在單個表格中選擇唯一行(和最新日期)。我將如何去結合這兩個?

連接兩個表:

select * 
from Table01 AS s 
left join Table02 AS p on s.id = p.id 

獲取唯一行,和最新的日期 - 在一個表:

select * from (
    select id_01, id_02, max(dt_date) AS MaxDt 
    from Table01 
    group by id_01, id_02) TempTable 
join Table01 ComTable on 
    TempTable.id_01 = ComTable.id_01 and 
    TempTable.id_02 = ComTable.id_02 and 
    TempTable.MaxDt = ComTable.dt_date 
order by ComTable.dt_date desc; 

我想我知道如何在第二個查詢做理論上(Table01應該是第一個查詢的結果,或者在訪問這兩個表之前獲取最新的日期行),但不知道如何在實踐中應用它。

編輯:
我所試圖做的事:
加入兩個表,選擇所有的列(不明確名稱的列將不包含或分配一個唯一的別名)。在這個新創建的連接表上,我想顯示所有唯一的行(基於id)和最新的日期。 (或者選擇最新的唯一行並加入兩個表)。

示例數據:

Table01 
ID column01 column02 column0X 
10 test  test123  testABC 

Table02 
ID columnA  columnB  columnY  dt_date 
10 data01  data02  data03  01/01/2012 
10 data11  data12  data13  02/02/2012 
10 data21  data22  data23  03/03/2012 
10 data31  data32  data33  04/04/2012 

Joined Table 
ID column01 column02 column0X columnA  columnB  columnY  dt_date 
10 test  test123  testABC  data01  data02  data03  01/01/2012 
10 test  test123  testABC  data11  data12  data13  02/02/2012 
10 test  test123  testABC  data21  data22  data23  03/03/2012 
10 test  test123  testABC  data31  data32  data33  04/04/2012 

Actual Output 
ID column01 column02 column0X columnA  columnB  columnY  dt_date 
10 test  test123  testABC  data31  data32  data33  04/04/2012 

在關於鏈接解決這個問題:
使用this導致以下錯誤:
The column 'xyz' was specified multiple times for 'Table01'.

刪除所有重複列(或使用唯一的別名),導致以下錯誤:
Column 'xyz' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

(其中「XYZ」可能是許多不同的列)。

SELECT 
    p.*, d.* 
FROM Table01 p 
left join 
( SELECT 
    alotofcolumnshere,MAX(dt_date) MaxDate 
    FROM Table02 s 
    GROUP BY s.id 
) d ON p.id = d.id 
    ORDER BY d.maxdate DESC; 

請注意,這個錯誤持續存在,直到我刪除除id列和MaxDate在SELECT語句中的所有列。這似乎是有道理的,因爲我不能在任何其他列上進行分組。此外,前面的查詢(和相應的問題)僅嘗試查找最大日期並將其添加到另一個表中的等效行。因此,我要求提供另一種方法,因爲我認爲這不適用於數據集。

謝謝

+1

「xyz」專欄被多次指定爲'表' - 使用谷歌這一點。無論如何,這意味着兩列在您加入的表格列表中具有相同的名稱。如果你需要的話,然後使用別名。 –

+0

當你在底部出現錯誤時,你是否使用'SELECT *'?嘗試列出你想要的字段。 –

+0

你爲什麼不簡單地把你的查詢和預期的輸出放在這裏,讓我們變得容易? –

回答

0

你應該加入你需要得到你的「連接表」上面的數據。然後,您可以使用MAXDate過濾出不再需要的行,並使用附加的子選擇。這加入到「連接表」需要通過ID和日期,以確保你只獲得你想要的數據!希望這會有所幫助:

SELECT p.*, p1.* 
FROM Table01 p 
INNER JOIN Table02 p1 ON p.Id = p1.Id 
INNER JOIN 
    ( SELECT s.id, MAX(dt_date) MaxDate 
     FROM Table02 s 
     GROUP BY s.id 
    ) d 
ON p1.id = d.id AND p1.MaxDate = d.MaxDate 
ORDER BY d.maxdate DESC; 
+0

謝謝!這似乎很好地工作。 –

相關問題