2つのSQL文を1つに結合する最良の方法は何でしょうか?2つのSQL文を結合する
SELECT MIN(capacity) AS mincapacity, MAX(capacity) AS maxcapacity
FROM room
SELECT MIN(grade) AS mingrade, MAX(grade) AS maxgrade
FROM room_grade
ありがとうございます!
2つのSQL文を1つに結合する最良の方法は何でしょうか?2つのSQL文を結合する
SELECT MIN(capacity) AS mincapacity, MAX(capacity) AS maxcapacity
FROM room
SELECT MIN(grade) AS mingrade, MAX(grade) AS maxgrade
FROM room_grade
ありがとうございます!
SELECT
*
FROM
(SELECT MIN(capacity) AS mincapacity, MAX(capacity) AS maxcapacity FROM room) AS room
CROSS JOIN
(SELECT MIN(grade) AS mingrade, MAX(grade) AS maxgrade FROM room_grade) AS room_grade
をここでの主な利点は、1行上のすべてのレコードを持っている、と各テーブルのコンポーネントレコードを結合しません。
アグリゲーションを行う前にジョインを行うと、パフォーマンスに大きな差をつける重大なオーバーヘッドが発生します。
SELECT 'CAPACITY', MIN(capacity) AS min, MAX(capacity) AS max
FROM room
UNION
SELECT 'GRADE', MIN(grade) AS min, MAX(grade) AS max
FROM room_grade
が該当します。
あなたは恐ろしいJOIN
構文でこれを行うことができます:
SELECT MIN(capacity) AS mincapacity, MAX(capacity) AS maxcapacity, MIN(grade) AS mingrade, MAX(grade) AS maxgrade
FROM room, room_grade;
しかし、あなたは正しいJOIN
構文に
SELECT MIN(r.capacity) AS mincapacity, MAX(r.capacity) AS maxcapacity
, MIN(rg.grade) AS mingrade, MAX(rg.grade) AS maxgrade
FROM room r
JOIN room_grade rg
ON r.key = rg.key; (whatever the key is that joins the two tables)
私はこれをしません。結合によって不要なオーバーヘッドが追加され、2つの個別のクエリよりも劇的に悪化します。また、レコードが一方のタルベに存在し、他方のタルベに存在しない場合、結果が変更される可能性があります。 – MatBailie
SELECT MIN(capacity) AS mincapacity, MAX(capacity) AS maxcapacity FROM room
UNION ALL
SELECT MIN(grade) AS mingrade, MAX(grade) AS maxgrade FROM room_grade
OR
のいずれかを使用する必要があります0SELECT MIN(r.capacity) AS mincapacity, MAX(r.capacity) AS maxcapacity,
MIN(rg.grade) AS mingrade, MAX(rg.grade) AS maxgrade
FROM room r
INNER JOIN room_grade rg ON r.Id = rg.room_id
ユニオンは面倒ですが、うまくいきますが、ジョインは膨大なオーバーヘッドを招きます。また、あるテーブルにレコードが存在し、他のテーブルにレコードが存在しない場合、結果が変更される可能性があります。 – MatBailie
あなたはどんなJOINオーバーヘッドですか? – sll
INNER結合を指定するとき、各レコードは他のテーブルに存在をチェックする必要があります。クエリを分離したままにすると、最悪の場合、現在存在する順序で各テーブルの全テーブルスキャンが実行されます。しかし、結合では、せいぜいテーブルにマージ結合が必要です。これは、各テーブルを独立してスキャンするよりはるかに高いです。 – MatBailie
あなたはIDフィールドに参加したいと思うでしょう。私は、 'room'テーブルには一意のキーフィールドがあり、room_gradeには同じフィールドがあると仮定します。そのような2つのものに参加してください。両方の結果セットが一つだけの行それぞれが含まれていることを考えると
SELECT MIN(r.capacity) AS mincapacity, MAX(r.capacity) AS maxcapacity, MIN(g.grade) AS mingrade, MAX(g.grade) AS maxgrade
FROM room r
inner join room_grade g
on room r.roomId = g.roomId
ジョインは膨大なオーバーヘッドを招きます。また、あるテーブルにレコードが存在し、他のテーブルにレコードが存在しない場合、結果が変更される可能性があります。 – MatBailie
は、最も簡単な方法は、クロス参加することになります。
select * from
(SELECT MIN(capacity) AS mincapacity, MAX(capacity) AS maxcapacity FROM room) r
cross join
(SELECT MIN(grade) AS mingrade, MAX(grade) AS maxgrade FROM room_grade) g
+1:私もビートしてください:) – MatBailie
結果セットのスキーマが返されるのはあなたですか? – sll
2つのテーブルの間に共通鍵がありますか? – Taryn
なぜこれらのステートメントを1つにまとめたいのですか?一見、悪い考えのようです... –