2011-07-08 84 views
4

我是MySQL用戶。我有兩個疑問,並且我想比較他們的結果爲等於。我想用一個查詢返回true或false來做到這一點,所以我的兩個查詢都很可能採用子查詢的形式。如何在MySQL中比較兩個查詢結果是否相等?

我想避免從這兩個查詢中返回結果並在應用程序級別進行比較,以減少通信並提高性能。我還想避免在數據庫層面循環結果,但如果沒有其他方法,那就這樣做。

我已經搜索了一個關於如何做到這一點的例子,但都是空手而來。一些示例代碼將不勝感激,因爲我是SQL編程的新手。謝謝!

注:我正在尋找一種解決方案,可以處理任意兩個任意查詢,所以我將不會發布我的兩個查詢碰巧是什麼。

+0

如果您向我們提供您所什麼已經有人可能會幫助你。 –

+0

我什麼都沒有。就像我在帖子中說的,我空手而過 –

+0

也許提供你的數據庫模式以及你想要檢索的數據 - 可能有更好的選擇。 –

回答

3

這將是一個更容易一些,如果在MySQL支持FULL OUTER JOIN還要注意的是,如果兩個查詢給出相同的結果,但在不同的順序,將被視爲equivlant

SELECT 
    COUNT(*) 
FROM 
(
    (SELECT A, b, c FROM A) a 
    LEFT OUTER JOIN 
     (SELECT A, b, c FROM b) B 
    ON A.a = b.a and a.b = b.b and a.c = b.c 
UNION 
    (SELECT A, b, c FROM A) a 
    RIGHT OUTER JOIN 
    (SELECT A, b, c FROM b) B 
    ON A.a = b.a and a.b = b.b and a.c = b.c 
) 
WHERE a.a is null or b.a is null 

如果計數= 0,則兩查詢是相同的

也因爲我使用UNION重複正在被刪除。所以這裏可能存在一些不準確的地方。

+0

不準確性可以通過解決使用UNION ALL而不是UNION來保存重複項? –

+0

這並不是真正普遍的,因爲每當內部查詢發生變化時您都需要修改'JOIN'和'WHERE'子句。 – JNK

+0

@JNK嗯所以評論是「查詢將改變每次查詢改變」很好知道;)我想德姆解決方案需要更少的變化,但它不是更普遍。 –

8
SELECT 
    CASE WHEN count1 = count2 AND count1 = count3 THEN 'identical' ELSE 'mis-matched' END 
FROM 
(
    SELECT 
    (SELECT COUNT(*) FROM <query1>) AS count1, 
    (SELECT COUNT(*) FROM <query2>) AS count2, 
    (SELECT COUNT(*) FROM (SELECT * FROM query1 UNION SELECT * FROM query2) AS unioned) AS count3 
) 
    AS counts 
+0

+1不錯,簡單。當然,它具有相同的問題,礦用的DUP和秩序 –

+0

或許,如果你去與UNION ALL,做'WHEN共1個記錄= COUNT2 AND(共1個記錄* 2)= Count3'你不會有問題的Dupe的 –

+1

邏輯*只*因爲UNION不包含重複項而工作。否則,它只是檢查的記錄,而不是內容的相對數量。 – MatBailie

2

你不能這樣做在MySQL,減,所以這裏是如何做到這一點沒有:

select if(count(*)=0,'same','different') from (
select col1,col2,col3 
from tableone 
where (col1, col2, col3) not in 
(select col4, col5, col6 
    from tabletwo) 
union 
select col4, col5, col6 
from tabletwo 
where (col4, col5, col6) not in 
(select col1, col2, col3 
    from tableone) 
) minusintersec; 

這給了:

tableone (col1 integer, col2 integer, col3 integer); 

tabletwo (col4 integer, col5 integer, col6 integer); 
相關問題