我想知道是否有可能使where子句将2列与同一子查询进行比较。我知道我可以做一个临时表/变量表或写相同的子查询两次。但如果可能的话,我想避免所有这些。Subquery很长很复杂,如果我必须写两次,将会造成很大的开销。
这是我正在尝试做的一个例子。
SELECT * FROM Table WHERE (Column1 OR Column2) IN (Select column from TABLE)
我正在寻找一个简单的答案,可能只是NO,但如果可能的话,没有太复杂的东西,请给我提示。
我更新了选择使用OR而不是AND,因为这更好地澄清了我的问题。
您给出的示例可能使用存在效果最好,例如:
select *
from t1
where exists (
select 1 from t2
where t2.col = t1.col1 and t2.col = t1.col2
);
为了避免将复杂的子查询写入两次,您可以使用CTE(公共表表达式):
;WITH MyFirstCTE (x) AS
(
SELECT [column] FROM [TABLE1]
-- add all the very complicated stuff here
)
SELECT *
FROM Table2
WHERE Column1 IN (SELECT x FROM MyFirstCTE)
AND Column2 IN (SELECT x FROM MyFirstCTE)
或使用EXISTS:
;WITH MyFirstCTE (x) AS
(
SELECT [column] FROM [TABLE1]
-- add all the very complicated stuff here
)
SELECT *
FROM Table2
WHERE EXISTS (SELECT 1 FROM MyFirstCTE WHERE x = Column1)
AND EXISTS (SELECT 1 FROM MyFirstCTE WHERE x = Column2)
- 我故意用了笨拙的名字,最好选个更好的。
- 我从
;
开始,因为如果它不是大脚本中的第一个命令,那么需要;
将CTE与之前的命令分开。