我在数据库中有两个表(myCustomTable1和myCustomTable2),并从中创建另外两个表(Table1和Table2),它们是在运行时创建的。 现在,我需要获取Table1内的行,而不是Table2内的行。
我发现了this question,它似乎包含了我需要的答案,但是我不能用我的解决方案来实现,因为如上所述,在运行期间生成了我需要“抗联接”的表时间。
我的(运行时生成的)两个表都具有以下格式:
-----------------------
| Column1 | Column2 |
-----------------------
| | |
-----------------------
| | |
-----------------------
这是我的代码。
SELECT Table1.* FROM (
SELECT myCustomTable1.Column1,
myCustomTable1.Column2
) as Table1
LEFT JOIN
(
SELECT Table2.* FROM (
SELECT myCustomTable2.Column1,
myCustomTable2.Column2
) as Table2
)
ON Table1.Column1 = Table2.Column1
AND Table1.Column2 = Table2.Column2
现在,我知道此解决方案无法正常工作,因为尝试加入时,我正在尝试使用Table2,该表在全局范围内不可用,但是我找不到任何合适的解决方案。
也许也可以使用NOT EXISTS
,LEFT OUTER JOIN
或NOT IN
,但是在每次尝试中,我都会遇到相同的问题,即已定义表的范围是一个问题。 / p>
答案 0 :(得分:1)
我发现在CTE中分离您的集要容易得多
;WITH Table1 AS
(
SELECT
myCustomTable1.Column1,
myCustomTable1.Column2
FROM
myCustomTable1
),
Table2 AS
(
SELECT
myCustomTable2.Column1,
myCustomTable2.Column2
FROM
myCustomTable2
)
SELECT *
FROM Table1 as t1
WHERE
NOT EXISTS (SELECT 1
FROM Table2 as t2
WHERE t1.Column1 = t2.Column1
AND t1.Column2 = t2.Column2);
答案 1 :(得分:0)
您在内部suquery中错过了一个from表,而在外部左连接中错过了一个表别名,请尝试使用
SELECT Table1.* FROM (
SELECT myCustomTable1.Column1,
myCustomTable1.Column2
) as Table1
LEFT JOIN
(
SELECT Table2.* FROM (
SELECT myCustomTable2.Column1,
myCustomTable2.Column2
FROM myCustomTable2
) as Table2
) as table 3
ON Table1.Column1 = Table3.Column1
AND Table1.Column2 = Table3.Column2
答案 2 :(得分:0)
您可以使用select
中的Table1
not exists
where
中的记录,排除匹配项:
select *
from Table1
where
not exists(select 1
from Table2
where Table1.Column1 = Table2.Column1 and Table1.Column2 = Table2.Column2);
答案 3 :(得分:0)
如果您将别名Table1和Table2表示为创建的运行时,将无法正常工作吗?:
SELECT Table1.*
FROM (
SELECT myCustomTable1.Column1,
myCustomTable1.Column2
) as Table1
LEFT JOIN
(
SELECT myCustomTable2.Column1,
myCustomTable2.Column2
) as Table2
ON Table1.Column1 = Table2.Column1
AND Table1.Column2 = Table2.Column2
where Table2.Column1 is null;
或者(更好的恕我直言):
SELECT Column1,
Column2
from myCustomTable1 t1
where not exists
(
SELECT * from myCustomTable2 t2 where
t1.Column1 = t2.Column1 and t1.Column2 = t2.Column2
);