有可能实现这样的事情吗?
WITH subQ(attr1) as (SELECT attr1 FROM tab1)
SELECT tab2.attr2, FROM tab2
where tab2.attr2 not in subQ
我不想在“不在”之后写子选择。
有可能实现这样的事情吗?
WITH subQ(attr1) as (SELECT attr1 FROM tab1)
SELECT tab2.attr2, FROM tab2
where tab2.attr2 not in subQ
我不想在“不在”之后写子选择。
正确的 SQL 使用子查询:
WITH subQ(attr1) as (
SELECT attr1
FROM tab1
)
SELECT tab2.attr2
FROM tab2
where tab2.attr2 not in (select attr1 from subQ);
CTE 被视为表别名,因此应从from
子句中引用它。
相反,我更喜欢NOT EXISTS
更清晰且不易出错的方法:
WITH CTE as
(
SELECT attr1 FROM tab1
)
SELECT tab2.attr2 FROM tab2
WHERE NOT EXISTS
(
SELECT 1 FROM CTE WHERE CTE.tab1=tab2.attr2
)
但是,我根本不认为需要 CTE。
我应该使用 NOT IN、OUTER APPLY、LEFT OUTER JOIN、EXCEPT 还是 NOT EXISTS?
with subQ(attr1) as
(
SELECT attr1 FROM tab1
)
SELECT tab2.attr2
FROM tab2
intersect
select tab2.attr1 from subQ