Как сделать левое соединение сгенерированных таблиц во время выполнения? - PullRequest
0 голосов
/ 04 июля 2018

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

Ответы [ 4 ]

0 голосов
/ 04 июля 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
);
0 голосов
/ 04 июля 2018

Мне гораздо проще разделить ваши наборы в 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);
0 голосов
/ 04 июля 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);
0 голосов
/ 04 июля 2018

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

  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
...