如何在运行时生成的表上进行左联接?

时间:2018-07-04 18:24:11

标签: sql sql-server left-join not-exists notin

我在数据库中有两个表(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 EXISTSLEFT OUTER JOINNOT IN,但是在每次尝试中,我都会遇到相同的问题,即已定义表的范围是一个问题。 / p>

4 个答案:

答案 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
);