2016-04-13 51 views
0

這裏是二一見鍾情等於查詢:MySQL的工會不確定性

SELECT obj_id 
FROM obj t JOIN joined_a a ON t.`id` = a.`obj_id` 
UNION 
SELECT obj_id 
FROM obj t JOIN joined_b b ON t.`id` = b.`obj_id`; 

SELECT obj_id 
FROM obj t JOIN joined_b b ON t.`id` = b.`obj_id` 
UNION 
SELECT obj_id 
FROM obj t JOIN joined_a a ON t.`id` = a.`obj_id`; 

他們只用選擇的順序不同。

結果行數量來自這兩個查詢是不同的!

這怎麼可能?

如果我將DISTINCT添加到每個SELECT ...行數量將具有NEW值,最大值!

如果我加括號每個選擇像

(select ...) 
UNION 
(select ...) 

行數量將有DISTINCT的價值。

+0

請您發表您的疑問,正是因爲他們是和一些示例數據(足以重現) – Quassnoi

+0

我認爲這是確定的 - 在至少如果'obj_id'在兩個表中都有完全相同的類型,那麼你的測試有些問題。可以想象,類型可能取決於語句的順序,但MySQL文檔聲稱所有子查詢都用於確定輸出類型。你意識到對結果排序沒有保證,除非你使用'order by'。 –

回答

1

這兩個查詢將返回相同的行,但不一定按相同的順序。

UNION會爲您重新計算結果,因此DISTINCT不執行任何操作,並且無論SELECT順序如何,結果集的大小都是相同的。

適合您的測試的唯一解釋是在兩者的運行之間插入了更多數據。

0

你是對的!

我陷入了一個帶有SQLYog終極GUI界面v11.11 BUG-feacher的陰險陷阱!

GUI添加到每個查詢限制0,1000; 。後綴 :(在命令行

檢查查詢和它的做工精細

+0

是的,這樣做..猜猜還有另一種解釋! – Arth