0

私は2つのテーブルを持っています

テーブル構造は次のようになります

表 A

╔══════╦════════╗
║ P_ID ║ P_NAME ║
╠══════╬════════╣
║    1 ║ name1  ║
║    2 ║ name2  ║
║    3 ║ name3  ║
║    4 ║ name5  ║
╚══════╩════════╝

表 B

╔═════╦════════╦════════╦═══════════╦═══════╗
║ ID  ║  P_ID  ║  C_ID  ║  C_PRICE  ║  TIME ║
╠═════╬════════╬════════╬═══════════╬═══════╣
║  1  ║      1 ║      3 ║        11 ║ 11111 ║
║  2  ║      2 ║      4 ║        22 ║ 22222 ║
║  3  ║      3 ║      5 ║        33 ║ 33333 ║
║  4  ║      3 ║      6 ║        44 ║ 44444 ║
║  5  ║      3 ║      6 ║        55 ║ 55555 ║
║  6  ║      4 ║      7 ║        66 ║ 66666 ║
╚═════╩════════╩════════╩═══════════╩═══════╝

要件は次のとおりです
。 1. 2 つのテーブルを結合します
。 2. Group By C_ID
3. Group By の最新の行

ビル・カーウィンによる回答を変更しようとしました あるテーブルの最新の行を別のテーブルに結合するにはどうすればよいですか?

SELECT e.*, s1.*  
FROM table_a e   
INNER JOIN
table_b s1
    ON (e.p_id = s1.p_id)   
LEFT OUTER JOIN table_b s2
    ON (e.p_id = s2.p_id AND s1.id < s2.id) 
WHERE s2.p_id IS NULL;

しかし、私が望むものを達成できませんでした。彼の答えから私は得るでしょう

╔═════╦════════╦════════╦═══════════╦═══════╦═════════╗
║ ID  ║  P_ID  ║  C_ID  ║  C_PRICE  ║  TIME ║  P_NAME ║
╠═════╬════════╬════════╬═══════════╬═══════╬═════════╣
║  1  ║      1 ║      3 ║        11 ║ 11111 ║ name1   ║
║  2  ║      2 ║      4 ║        22 ║ 22222 ║ name2   ║
║  5  ║      3 ║      6 ║        55 ║ 55555 ║ name3   ║
║  6  ║      4 ║      7 ║        66 ║ 66666 ║ name5   ║
╚═════╩════════╩════════╩═══════════╩═══════╩═════════╝

しかし、私が望む出力は次のとおりです(重複する P_ID は問題ありませんが、重複する P_ID ごとに重複する C_ID はありません)

╔═════╦════════╦════════╦═══════════╦═══════╦═════════╗
║ ID  ║  P_ID  ║  C_ID  ║  C_PRICE  ║  TIME ║  P_NAME ║
╠═════╬════════╬════════╬═══════════╬═══════╬═════════╣
║  1  ║      1 ║      3 ║        11 ║ 11111 ║ name1   ║
║  2  ║      2 ║      4 ║        22 ║ 22222 ║ name2   ║
║  3  ║      3 ║      5 ║        33 ║ 33333 ║ name3   ║
║  5  ║      3 ║      6 ║        55 ║ 55555 ║ name3   ║
║  6  ║      4 ║      7 ║        66 ║ 66666 ║ name5   ║
╚═════╩════════╩════════╩═══════════╩═══════╩═════════╝
4

2 に答える 2

1
SELECT e.*, s1.*
FROM table_a e INNER JOIN 
(SELECT * FROM (SELECT * FROM table_b ORDER BY time DESC) temp GROUP BY c_id) s1;

最も内側の ORDER BY は、同じ c_id に対して目的の行が常に最初に来ることを保証し、外側の GROUP BY は c_id でグループ化し、特に指定しない場合は、各グループで見つかった最初の行を返します。

于 2012-12-07T08:33:16.010 に答える
0

絶対です

  1. 2 つのテーブルを結合する
  2. C_ID でグループ化
  3. 選択したフィールドで並べ替えられた各グループの説明の番号行 (最後の暗黙の順序!)
  4. 行番号 = 1 でフィルター処理します。

これは、行に番号を付けるのに役立ちます。

于 2012-12-07T08:31:37.723 に答える