0

我的问题与这个问题有点相似 - MySQL select 1 row from inner join

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

我有一个表 A(tableA),这个表在 tableB 中有很多状态。新状态一直在添加。

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

我正在尝试获取一个查询,它将带回 TableA 中的所有值,并使用内部连接从 tableB 中获取这些行的最新“值”。最新的是时间最晚的那个。

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

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

有任何想法吗?

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

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

TableA - 'Id'、'Name' TableB - 'Id'、'proId'、'State'、'time'

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

4

3 回答 3

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
于 2012-06-18T16:11:08.177 回答
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
于 2012-06-18T13:52:56.970 回答
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
于 2012-06-18T14:15:31.813 回答