选择语句以从内部联接获取特定行

时间:2012-06-18 13:44:45

标签: inner-join sql

我的问题与此问题类似 - MySQL select 1 row from inner join

然而,它从来没有真正以我需要的方式回答。所以我想我会问。

我有一个表A(tableA),这个表在tableB中有一堆状态。新州一直在增加。

TableB有一个“State”列,它有一个TableA.Id的外键。该表B具有值和时间戳

我正在尝试获取一个查询,该查询将返回TableA中的所有值,并使用内部联接从tableB中获取这些行的LATEST'值'。最新的是最新的时间。

我知道如何在需要的地方进行内部连接,并且我知道如何订购表以恢复最新的“时间”行,但是我不知道如何将这两者放在一起并创建单个查询

我确定我必须在选择中选择一个,这很好。但是,我要避免的是将DataTable带回TableA的所有结果,并分别对tableB上的每个结果进行查询。

有什么想法吗?

编辑 - 我在这个问题上犯了一个错误,我在尝试实现其中一个答案时才真正注意到了。

我在TableA.id和TableB.proId之间有一个外键

表A - 'Id','名称' 表B - 'Id','proId','State','time'

我希望通过B上的连接返回TableA的所有值,以恢复最大时间的“状态”

3 个答案:

答案 0 :(得分:1)

SELECT T.Id,
       T.Name,
       T.State
  FROM 
(
    SELECT A.ID,
           A.Name,
           B.State,
           ROW_NUMBER() OVER ( PARTITION BY A.ID ORDER BY B.Timestamp DESC) RowNumber
      FROM Table_A A
     INNER JOIN Table_B B on A.Id = B.ProdId
) T
WHERE T.RowNumber = 1

答案 1 :(得分:0)

假设给定状态没有重复的时间戳:

select table_a.*, foo.value as latest_value
from table_a left outer join (
    -- selects the value for the given state w/ the max timestamp
    select bar.*, table_b.value from (
        -- selects the max timestamp for a given state
        select state, max(timestamp) 
        from table_b 
        group by state
    ) bar
    left outer join table_b on 
    table_b.state = bar.state and
    table_b.timestamp = bar.timestamp
) foo 
on foo.state = table_a.id

或者,您可以使用first_value,这是一个不那么冗长但更加模糊的内容:

select table_a.*, foo.value as latest_value
from table_a left outer join (
    select distinct state, 
    first_value(value) over (
        partition by state order by timestamp desc
    )
    from table_b
) foo
on foo.state = table_a.id

答案 2 :(得分:0)

Select Table_A.*
From Table_A 
LEFT JOIN 
(Select State, max(timestamp) 
From Table_B
Group BY State) b 
ON Table_A.Sate = b.State