如何对 运行 时间生成的表进行左连接?

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 EXISTSLEFT OUTER JOINNOT 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
);