如何对 运行 时间生成的表进行左连接?
How to do a left join on a run-time generated tables?
我在数据库中有两个表(myCustomTable1 和 myCustomTable2),我正在从它们创建另外两个在 运行 时间创建的表(Table1 和 Table2)。 现在我需要获取表 1 中但不在表 2 中的行。
我发现 this question,它似乎包含我需要的答案,但我无法用我的解决方案实现它,因为如上所述,我需要 "antijoin"在 运行 时间内生成。
我的两个(运行 时间生成的)表的格式为:
-----------------------
| 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
也是一种选择,但在每次尝试中,我都遇到了同样的问题,即定义表的范围是个问题.
你错过了内部 suquery 中的 table 和外部左连接中的 table 别名尝试使用
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
我发现在 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);
您可以 select
来自 Table1
的记录排除 where
中使用 not exists
的匹配:
select *
from Table1
where
not exists(select 1
from Table2
where Table1.Column1 = Table2.Column1 and Table1.Column2 = Table2.Column2);
如果您指的是运行时创建的别名 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
);
我在数据库中有两个表(myCustomTable1 和 myCustomTable2),我正在从它们创建另外两个在 运行 时间创建的表(Table1 和 Table2)。 现在我需要获取表 1 中但不在表 2 中的行。
我发现 this question,它似乎包含我需要的答案,但我无法用我的解决方案实现它,因为如上所述,我需要 "antijoin"在 运行 时间内生成。
我的两个(运行 时间生成的)表的格式为:
-----------------------
| 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
也是一种选择,但在每次尝试中,我都遇到了同样的问题,即定义表的范围是个问题.
你错过了内部 suquery 中的 table 和外部左连接中的 table 别名尝试使用
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
我发现在 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);
您可以 select
来自 Table1
的记录排除 where
中使用 not exists
的匹配:
select *
from Table1
where
not exists(select 1
from Table2
where Table1.Column1 = Table2.Column1 and Table1.Column2 = Table2.Column2);
如果您指的是运行时创建的别名 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
);