2012-03-22 8 views
2

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 

ありがとうございます!

+1

結果セットのスキーマが返されるのはあなたですか? – sll

+0

2つのテーブルの間に共通鍵がありますか? – Taryn

+3

なぜこれらのステートメントを1つにまとめたいのですか?一見、悪い考えのようです... –

答えて

3
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行上のすべてのレコードを持っている、と各テーブルのコンポーネントレコードを結合しません。

アグリゲーションを行う前にジョインを行うと、パフォーマンスに大きな差をつける重大なオーバーヘッドが発生します。

+0

うわー、私はCROSS JOINがそのようなタスクのためのパーフォロマンスキラーだと思っていました。 – sll

+0

@sll - 集計してから参加します。 1レコードを1レコードに結合しています。 n個のレコードをm個のレコードに結合し、集約するのではなく。 – MatBailie

+0

@MatBailie http://stackoverflow.com/questions/39471531/combining-update-select-sql-statementsをご覧ください。 – Schalton

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 

が該当します。

1

あなたは恐ろしい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) 
+0

私はこれをしません。結合によって不要なオーバーヘッドが追加され、2つの個別のクエリよりも劇的に悪化します。また、レコードが一方のタルベに存在し、他方のタルベに存在しない場合、結果が変更される可能性があります。 – MatBailie

1

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

のいずれかを使用する必要があります0
SELECT 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 
+0

ユニオンは面倒ですが、うまくいきますが、ジョインは膨大なオーバーヘッドを招きます。また、あるテーブルにレコードが存在し、他のテーブルにレコードが存在しない場合、結果が変更される可能性があります。 – MatBailie

+0

あなたはどんなJOINオーバーヘッドですか? – sll

+0

INNER結合を指定するとき、各レコードは他のテーブルに存在をチェックする必要があります。クエリを分離したままにすると、最悪の場合、現在存在する順序で各テーブルの全テーブルスキャンが実行されます。しかし、結合では、せいぜいテーブルにマージ結合が必要です。これは、各テーブルを独立してスキャンするよりはるかに高いです。 – MatBailie

1

あなたは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 
+0

ジョインは膨大なオーバーヘッドを招きます。また、あるテーブルにレコードが存在し、他のテーブルにレコードが存在しない場合、結果が変更される可能性があります。 – MatBailie

4

は、最も簡単な方法は、クロス参加することになります。

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 
+0

+1:私もビートしてください:) – MatBailie

関連する問題