子选择中存在一列或另一列的位置

时间:2014-06-17 17:30:01

标签: sql sql-server tsql sql-server-2012 where-clause

我希望做这样的事情:

SELECT a, b, c, d FROM someTable WHERE
    WHERE a in (SELECT testA FROM otherTable);

只有我希望能够测试2列的子选择中是否存在2列。

SELECT a, b, c, d FROM someTable WHERE
    WHERE a OR b in (SELECT testA, testB FROM otherTable);

我们正在使用MS SQL Server 2012

4 个答案:

答案 0 :(得分:4)

试试这个

SELECT a, b, c, d 
FROM someTable WHERE
WHERE a IN (SELECT testA FROM otherTable) 
   OR b IN (SELECT testB FROM otherTable)

 SELECT a, b, c, d 
        FROM someTable WHERE
        WHERE EXISTS 
          (SELECT NULL 
           FROM otherTable 
           WHERE testA = a OR testB = a 
             OR testA = b OR testB = b) 

<强>更新 如果您的性能不佳,可能需要在testB列上添加索引。 对CROSS APPLY

使用MS SQL的另一个选项
SELECT a, b, c, d 
        FROM someTable ST
           CROSS APPLY (
               SELECT 1
               FROM otherTable OT
               WHERE OT.testA = ST.a OR OT.testB = ST.b
           )

如果其中任何一项无效,请尝试使用 UNION 。大多数 UNION OR

提供更好的性能
SELECT a, b, c, d 
    FROM someTable WHERE
    WHERE a IN (SELECT testA FROM otherTable)
 UNION
    SELECT a, b, c, d 
    FROM someTable WHERE
    WHERE b IN (SELECT testB FROM otherTable)

更新2:

有关OR和UNION差异的进一步阅读

Why is UNION faster than an OR statement

答案 1 :(得分:1)

如果我正确理解您的问题,LEFT JOIN可能就是这样的方式:

SELECT a, b, c, d
FROM TableA ta
LEFT JOIN TableB tb
ON ta.a = tb.a
    AND ta.b = tb.b
WHERE tb.a IS NOT NULL
    AND tb.c IS NOT NULL

你也可以使用UNION和INNER JOIN:

SELECT a, b, c, d
FROM someTable
INNER JOIN OtherTable OT on someTable.B = OT.testB
UNION
SELECT a, b, c, d
FROM someTable
INNER JOIN OtherTable OT ON someTable.A= OT.testA

请注意,如果列上有索引

,则JOIN方法应该快几个数量级

答案 2 :(得分:1)

试试这个..

SELECT a, b, c, d 
FROM someTable 
WHERE Exists 
(
    SELECT 1
    FROM otherTable 
    Where a = testA OR b = testB 
)

答案 3 :(得分:0)

加入似乎是一种选择,您是否考虑过将它们与联盟一起使用?

SELECT a, b, c, d 
FROM someTable 
INNER JOIN OtherTable OT on someTable.B = OT.testB 
UNION 
SELECT a, b, c, d 
FROM someTable 
INNER JOIN OtherTable OT ON someTable.A= OT.testA