0

私が持っている質問は、これと似たようなものです-MySQLは内部結合から1行を選択します

しかし、私が必要とする方法で実際に答えられることはありませんでした。それで聞いてみようと思いました。

テーブル A (テーブル A) があり、このテーブルにはテーブル B に多数の状態があります。新しい州は常に追加され続けています。

TableB には、TableA.Id への外部キーを持つ列「State」があります。このテーブル B には値とタイムスタンプがあります

テーブルAのすべての値を返す1つのクエリを取得しようとしています。内部結合を使用して、テーブルBからそれらの行の最新の「値」を取得します。最新とは、時刻が最新のものです。

必要な場所で内部結合を行う方法と、テーブルを注文して最新の「時間」行を戻す方法は知っていますが、これら 2 つを組み合わせて単一のクエリを作成する方法はわかりません。

選択内に選択が必要になると確信していますが、これで問題ありません。ただし、回避しようとしているのは、TableA からのすべての結果を DataTable に戻し、tableB のそれぞれに対して個別にクエリを実行することです。

何か案は?

編集-質問を間違えました。回答の1つを実装しようとしたときにだけ気づきました。

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 に答える