0

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

table 'g'
+------+
| id   |
+------+
|    1 |
|   32 |
|    3 |
|    6 |
|    5 |
|   22 |
|   54 |
|   21 |
+------+

table 'h'
+------+------+
| id   | sl   |
+------+------+
|    1 |  323 |
|   11 |  423 |
|    1 |  333 |
|   33 |   32 |
|   44 |  443 |
+------+------+

次のような2つのテーブルのレコードを表示するにはどうすればよいですか(「g」テーブルと「h」テーブルから個別のIDを選択し、IDごとに「h」テーブルから最大の「sl」を結合します。「g」テーブルの「id」と一致しないテーブル'h'の'id'、それらの'sl'フィールドはnullになります)

+------+------+
| id   | sl   |
+------+------+
|    1 |  333 |
|   32 | null |
|    3 | null |
|    6 | null |
|    5 | null |
|   22 | null |
|   54 | null |
|   21 | null |
|   11 |  423 |
|   33 |   32 |
|   44 |  443 |
+------+------+

-ありがとう。

4

1 に答える 1

2

これは、値を取得するためにUNION派生テーブルとして結合されたままの 2 つの間で実行できます。hMAX()

SELECT
  allids.id,
  MAX(sl) AS sl
FROM
  /* Subquery gets UNION (distinct, not UNION ALL) of ids from both tables */
  (SELECT id FROM g UNION SELECT id FROM h) allids
  /* LEFT JOINed back against `h` for the MAX() aggregates */
  LEFT JOIN h ON allids.id = h.id
GROUP BY id

http://sqlfiddle.com/#!2/2c348/3

コメント後の更新:

それらが挿入された任意の(順序付けられていない)順序で強制的にソートするには、ORDER BY.

ただし、行が挿入される順序は、RDBMS にとってはあまり意味がありません。ORDER BY条項がなければ、それらが常に同じ順序で返されると確実に想定することはできません。

SELECT
  allids.id,
  MAX(sl) AS sl
FROM
  /* Awful hack adds a number literal which is used in the ORDER BY */
  /* This still won't guarantee that the rows from each table will be in the original order though */
  (SELECT id, 1 AS sort FROM g UNION SELECT id, 2 AS sort FROM h) allids
  LEFT JOIN h ON allids.id = h.id
GROUP BY id
ORDER BY sort

http://sqlfiddle.com/#!2/2c348/6

于 2012-12-31T03:11:33.310 に答える