如果您JOIN
将有问题的表转换为另一个表(例如临时表或变量表),您可以非常有效地获得您正在寻找的结果。我整理了一个像这样的简单测试:
CREATE TABLE KeyTest
(
C1 INT NOT NULL
, C2 INT NOT NULL
CONSTRAINT PK_KeyTest PRIMARY KEY CLUSTERED (C1, C2)
);
INSERT INTO KeyTest (C1, C2) VALUES (
CAST((RAND() * 1000E0) AS INT),
CAST((RAND() * 10000E0) + 1000 AS INT));
GO 100
SELECT * FROM KeyTest; /* make note of a sample row for the next step
in my example, a randomly chosen row had
C1 = 275 and C2 = 6367
*/
DECLARE @TestFilter TABLE
(
C1 INT NOT NULL
, C2 INT NOT NULL
);
INSERT INTO @TestFilter (C1, C2) VALUES (275,6366);
SELECT KT.*
FROM KeyTest KT
INNER JOIN @TestFilter TF ON KT.C1 = TF.C1 AND KT.C2 >= TF.C2;
这将返回与 C1 匹配且大于或等于 C2 且值包含在 中的所有行@TestFilter
,在我的示例中为 275 和 6366。结果:

您可以通过以下方式轻松更改此设置以返回复合键与 C1 上大于 10 的值匹配的所有行:
INSERT INTO @TestFilter (C1, C2) VALUES (10,0);
SELECT KT.*
FROM KeyTest KT
INNER JOIN @TestFilter TF ON KT.C1 > TF.C1;