2016-12-28 61 views
4

有些不好的標題可能會出現,但我試圖解釋我的意思。用於搜索和刪除多個關鍵列的SQL

我用這樣的SQL來建立一個列表

SELECT id 
FROM parcel 
WHERE id IN (113715, 113824, 113855, 113954, 114010, 114116, 114272, 114329) 

其中ID是在被隔離是唯一的,非常簡單的包裹表中的列。

但是有些表格使用許多列是唯一的。

SELECT id1, id2 
FROM trip 
WHERE id1, id2 IN ((113715, 113824), (113855, 113954), (114010, 114116),(114272, 114329)) 

最後的SQL顯然不工作。

我要選擇行,其中

id1 = 113715 and id2=113824 or 
id1 = 113855 and id2=113954 or 
id1 = 114010 and id2=114116 or 
id1 = 114272 and id2=114329 

在現實中,生成的SQL可以包含500 - 1000的ID。

我應該使用什麼SQL?

EDIT

這是一個生成的SQL。該ID來自另一臺服務器上的另一個數據庫,因此例如JOIN是不可能的。

+0

這可能變慢。身份證從哪裏來?如果從表中可以加入 –

+0

,就像你說的那樣,其中id1 = 113715和id2 = 113824或id1 = 113855和id2 = 113954或... – Ali

+0

如果可能,我想使用IN運算符,因爲我認爲它更快 –

回答

5
SELECT id1, id2 FROM trip 
INTERSECT 
select id1, id2 from (values (113715,113824),(113855,113954),(114010,114116),(114272,114329)) a(id1,id2) 

使用INTERSECT

+2

'INTERSECT'是這個查詢的好主意。 –

+0

請注意'INTERSECT'與'INNER JOIN'不同,它返回不同的值 – Eric

+0

您可以使用'intersect all'返回所有值 –

1

不幸的是SQL Server不支持的元組在IN

SELECT id1, id2 
FROM trip 
WHERE (id1,id2) in ((113715,113824),(113855,113954),(114010,114116),(114272,114329)); 

這在一些其他DBMS有效。

所以,你可以按照你自己的建議

SELECT id1, id2 
FROM trip 
WHERE (id1 = 113715 and id2 = 113824) 
    OR (id1 = 113855 and id2 = 113954) 
    OR (id1 = 114010 and id2 = 114116) 
    ...; 

或者使用臨時表,熱膨脹係數等。最簡單的可能是加入一個值子句:

SELECT trip.id1, trip.id2 
FROM trip 
JOIN (VALUES (113715,113824),(113855,113954),(114010,114116),(114272,114329)) 
    AS src(id1, id2) ON src.id1 = trip.id1 AND src.id2 = trip.id2; 
5

你可以使用一個值列表中加入:

SELECT id1, id2 
FROM trip 
INNER JOIN (VALUES (113715,113824),(113855,113954),(114010,114116),(114272,114329)) V(a, b) 
ON id1 = a 
AND id2 = b 
+0

瞭解另一個快捷方式,謝謝 – Eric

2

您可以使用生成的ID這樣的嗎?

;WITH GenerateIds AS 
(
    SELECT * FROM (VALUES 
    -- Paste the Id list below 
    (113715,113824),(113855,113954),(114010,114116),(114272,114329) 
) t(id1, id2) 
) 
-- Use inner join 
SELECT id1, id2 FROM trip INNER JOIN GenerateIds g ON 
    trip.id1 = g.id1 AND trip.id2 = g.id2 
0

另一個簡單查詢:

SELECT id1, id2 
FROM trip 
WHERE 1 = 1 
AND ((id1 = 113715 and id2=113824) 
    OR (id1 = 113855 and id2=113954) 
    OR (id1 = 114010 and id2=114116) OR (id1 = 114272 and id2=114329))