2012-05-03 127 views
0

我有一個在Oracle上運行得非常快的查詢。將查詢從Oracle轉換爲TSQL

field1field2field3均爲整數

select * FROM MY_TABLE P WHERE 
USER_ID = 167 AND 
(field1,field2,field3) NOT IN 
(SELECT field1,field2,field3 FROM EXCLUSION_TABLE) 

我把它翻譯成T/SQL(SQL服務器2008 R2)

select * FROM MY_TABLE P WHERE 
USER_ID = 167 AND 
(cast(field1 as varchar)+ ','+cast(field2 as varchar)+ ','+ 
cast(field3 as varchar)) 
NOT IN 
(SELECT cast(field1 as varchar)+ ','+cast(field2 as varchar)+ ','+ 
cast(field3 as varchar) FROM EXCLUSION_TABLE) 

有沒有人有任何想法如何,我可以做不同呢?

謝謝。

+0

你確定,你貼了正確的Oracle查詢?您正在從my_table中選擇行,其中(field1,field2,field3)之一不等於'exclusion_table'中三個字段的** sum **。你確定這不應該是一個元組比較?例如:'(field1,field2,field3)not in(從exclusion_table中選擇field1,field2,field3)' –

+0

謝謝a_horse_with_no_name。我糾正了這個問題 – gordon613

回答

3

也許是這樣的:

select * 
FROM MY_TABLE P 
WHERE USER_ID = 167 
AND NOT EXISTS 
(
    SELECT 
     NULL 
    FROM 
     EXCLUSION_TABLE 
    WHERE 
     EXCLUSION_TABLE.field1=P.field1 
     AND EXCLUSION_TABLE.field2=P.field2 
     AND EXCLUSION_TABLE.field3=P.field3 
) 

你可以做同樣在Oracle

+0

+1你已經打敗了我,但似乎我們有同樣的想法:) –

+2

謝謝你arion和@lieven你的答案。我會接受arion,因爲它是第一個。我也會編輯我的問題,因爲我意識到查詢速度太慢的主要原因是因爲表上存在某種鎖定。再次感謝! – gordon613

+0

@Lieven:是的,我知道。我在23秒內擊敗了你。我們有同樣的想法很有意思:P。但所有的信譽,以及:) :) – Arion