Как выполнить левое соединение в таблицах, созданных во время выполнения?

У меня есть две таблицы в базе данных (myCustomTable1 и myCustomTable2), и из них я создаю еще две таблицы (Table1 и Table2), которые создаются во время выполнения. Теперь мне нужно взять строки, которые находятся внутри таблицы 1, но не находятся в таблице 2.

Я нашел этот вопрос, который, кажется, содержит ответ, который мне нужен, но я не могу реализовать это с моим решением, потому что, как сказано, таблицы, которые мне нужно «антиобъединять», генерируются во время выполнения.

Обе мои (генерируемые во время выполнения) таблицы имеют формат:

-----------------------
|  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 также является вариантом, но при каждой попытке я сталкивался с одной и той же проблемой, когда область действия определенных таблиц является проблемой.


person delux    schedule 04.07.2018    source источник
comment
Почему бы вам не показать нам, как вы создаете их во время выполнения? Табличная переменная, временная таблица, CTE создаются во время выполнения, но все они находятся в области видимости.   -  person Cetin Basoz    schedule 04.07.2018
comment
Поскольку вас интересуют только записи из таблицы 1, NOT EXISTS, вероятно, будет лучшим способом.   -  person Eric    schedule 04.07.2018
comment
Если область является проблемой, вам нужно привести пример кода, который создает таблицы, а затем пытается ссылаться на них. Вы говорите, что проблема не в LEFT JOIN, а в том, как SQL-Sever управляет областью; так покажи нам, что ты пытаешься сделать. (Вполне вероятно, что вы создаете табличные переменные, но лучше использовать временные таблицы, чтобы убедиться, что нам нужен ваш код...)   -  person MatBailie    schedule 04.07.2018


Ответы (4)


Мне намного проще разделить ваши наборы в 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);
person EzLo    schedule 04.07.2018

Вы пропустили таблицу from во внутреннем suquery и псевдоним таблицы во внешнем левом соединении, попробуйте использовать

  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
person scaisEdge    schedule 04.07.2018

Вы можете 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);
person Lajos Arpad    schedule 04.07.2018

Если бы вы имели в виду псевдонимы 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
);
person Cetin Basoz    schedule 04.07.2018