-1

有可能实现这样的事情吗?

WITH subQ(attr1) as (SELECT attr1 FROM tab1)

SELECT tab2.attr2,  FROM tab2

where tab2.attr2 not in subQ

我不想在“不在”之后写子选择。

4

3 回答 3

2

正确的 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子句中引用它。

于 2013-08-21T10:39:09.593 回答
1

相反,我更喜欢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?

于 2013-08-21T10:43:03.153 回答
0
with subQ(attr1) as
(
    SELECT attr1 FROM tab1
)
SELECT tab2.attr2
FROM tab2
intersect
select tab2.attr1 from subQ 
于 2013-08-21T10:42:50.753 回答