可能有点糟糕的标题,但我试着解释一下我的意思。
我使用这样的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。
答案 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))