使用多个键列进行搜索和删除的SQL

时间:2016-12-28 08:49:35

标签: sql sql-server

可能有点糟糕的标题,但我试着解释一下我的意思。

我使用这样的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?

修改

这是一个生成的SQL。 ID来自另一台服务器上的另一个数据库,因此无法进行JOIN。

5 个答案:

答案 0 :(得分:5)

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

USE INTERSECT

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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)
   ...;

或使用临时表,cte等。最简单的可能是加入一个值子句:

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;

答案 4 :(得分: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))