2011-05-30 91 views
0

以下2個查詢有什麼區別? (它們都產生相同的結果)2個聯合查詢之間的區別

select * 
from (
    select * from (
      select * 
      from phppos_items 
      where name like 'AB10LA2%' and deleted = 0 
      order by `name` limit 16 
      ) t 
    union 
    select * from (
      select * 
      from phppos_items 
      where item_number like 'AB10LA2%' and deleted = 0 
      order by `name` limit 16 
      ) t 
    union 
    select * from (
      select * 
      from phppos_items 
      where category like 'AB10LA2%' and deleted = 0 
      order by `name` limit 16 
      ) t 
) as top_rows 
order by `name` limit 16 

VS

select * 
from (
      (select * 
      from phppos_items 
      where name like 'AB10LA2%' and deleted = 0 
      order by `name` limit 16) 
    union 
      (select * 
      from phppos_items 
      where item_number like 'AB10LA2%' and deleted = 0 
      order by `name` limit 16) 
    union 
      (select * 
      from phppos_items 
      where category like 'AB10LA2%' and deleted = 0 
      order by `name` limit 16) 
) as top_rows 
order by `name` limit 16 

回答

3

第一個版本還有另一組臨時表,這是無用的,資源在這種特殊情況下的浪費。
以下所有會產生相同的結果:

SELECT * FROM T1; 

SELECT * FROM (SELECT * FROM T1); 


SELECT * FROM (SELECT * FROM (SELECT * FROM T1)); 

... 
... 

到無窮遠:-)

並在您的非常具體的情況下,這將是不夠的:

select * 
      from phppos_items 
      where 
       (name like 'AB10LA2%' OR item_number like 'AB10LA2%' OR category like 'AB10LA2%') 
      and deleted = 0 
      order by `name` limit 16 
+0

臨時表?我很確定兩個查詢都會產生相同的執行計劃。 – Magnus 2011-05-30 16:56:24

+0

原件不應該優先考慮按名稱找到的物品。 – 2011-05-30 17:01:37

+0

@Jonathan Leffler你是對的,編輯 – 2011-05-30 17:04:21

0

第一個查詢嵌入了一個額外的一套SELECT * FROM (sub-query)。優化器需要稍微長一些的時間來整理它。

在功能上,查詢之間沒有真正的區別。第二個更簡單,因此更可取。

0

我看到的唯一區別是在頂部,UNION的子查詢組件被命名。顯然,由於第二個版本沒有錯誤,所以MySQL在這個構造中不需要子查詢名稱。順便說一句,你有沒有測試過這個版本比使用OR的相應單個查詢快?