2014-03-31 46 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

谢谢!这似乎很好地工作。 –

相关问题