2012-03-22 198 views
2

將兩條SQL語句合併爲一條的最佳方式是什麼?合併兩條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 2012-03-22 16:00:09

+0

這兩張桌子之間是否有共同的鑰匙? – Taryn 2012-03-22 16:00:18

+3

你爲什麼要將這些陳述合併爲一個?乍一看,它看起來像個壞主意...... – 2012-03-22 16:01:07

回答

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 

主要好處這裏正在對一排的所有記錄,並不加入每個表的組件記錄。

在聚合之前涉及連接的答案將引入顯着的開銷,這將對性能產生巨大影響。

+0

哇,我認爲CROSS JOIN是這樣的任務的殺手殺手,在聚合函數中哪裏有一招? – sll 2012-03-22 17:37:59

+0

@sll - 聚合,然後加入。所以你加入1條記錄到1條記錄。而不是將n個記錄連接到m個記錄,然後進行聚合。 – MatBailie 2012-03-22 22:23:04

+0

@MatBailie 你可以看看http://stackoverflow.com/questions/39471531/combining-update-select-sql-statements – Schalton 2016-09-13 16:18:29

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

我不會這樣做。連接會增加不必要的開銷,並且會比兩個單獨的查詢表現得更差。另外,如果記錄存在於一個平臺但不存在,則可以改變結果。 – MatBailie 2012-03-22 16:10:25

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

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 2012-03-22 16:10:00

+0

你的意思是哪個JOIN開銷? – sll 2012-03-22 16:13:57

+0

當指定INNER連接時,每個記錄需要檢查另一個表中是否存在。保持查詢分開(最壞的情況下)按照當前存在的順序對每個表進行全表掃描。但通過連接,充其量,您需要在表上進行合併連接。這比獨立掃描每張桌子要高得多。 – MatBailie 2012-03-22 16:17:25

1

您希望加入ID字段。我假設'房間'表具有唯一的關鍵字段,並且room_grade可以具有相同的字段。在這兩件事上加入一個類似的東西。

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 2012-03-22 16:08:59

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 2012-03-22 16:09:34