2011-08-25 19 views
12
SELECT * FROM A 
JOIN B 
ON B.ID = A.ID 
AND B.Time = (SELECT max(Time) 
          FROM B B2 
          WHERE B2.ID = B.ID) 

これらの2つのテーブルをMYSQLに追加しようとしています。 IDがユニークであれば、私はこれをやろうとはしません。私は単純な絵を描くために実際の解決策を凝縮しました。私は特定のレコードの最大日付にテーブルBをつかんで参加しようとしています。この手順はSSISパッケージによって実行され、B2.IDは不明な列であると言います。私はこのようなことをMSSQLで頻繁に行い、MYSQLを初めて使用しています。誰でも指針やアイデアはありますか?MYSQL内のネストされたSelectステートメントjoin

答えて

27

サブクエリの代わりに排他結合を使用して、このタイプのクエリを別の方法で実行します。与えられたIDの最大時間を持つBの行を探したい。言い換えれば、他の行が時間が長く、同じIDを持たない行はありません。

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
LEFT OUTER JOIN B AS B2 ON B.ID = B2.ID AND B.Time < B2.Time 
WHERE B2.ID IS NULL 

はまた、相関サブクエリを使用してより良い実行する必要があり派生テーブルを、使用することができます。

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
JOIN (SELECT ID, MAX(Time) AS Time FROM B GROUP BY ID) AS B2 
    ON (B.ID, B.Time) = (B2.ID, B2.Time) 

P.S .: greatest-n-per-groupタグを追加しました。このタイプのSQL質問は、毎週Stack Overflowに出てくるので、そのタグをたどって何十もの類似の質問とその答えを見ることができます。

+2

偉大な答え! +1 – shesek

+0

まあ、ありがとう – JBone

関連する問題