Вставить строки, не содержащиеся в одной таблице, в другую - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть две почти идентичные таблицы, но для разницы около 100 строк (из 150k).Я знаю, как найти все строки, которые существуют в одной таблице, но не в другой, используя

SELECT [Column]
FROM [DB].[dbo].[Table_1] 
WHERE NOT EXISTS 
(SELECT * 
 FROM [DB].[dbo].[Table_1a] 
 WHERE [EDB].[dbo].[Table_1a].[Column] = [DB].[dbo].[Table_1].[Column])

Но я хочу иметь возможность вставлять пропущенные строки из Table_1 в Table_1a, ноПриведенный выше код не работает в операторе вставки:

INSERT [DB].[dbo].[Table_1] 
SELECT *
FROM [DB].[dbo].[Table_1a]
WHERE NOT EXISTS 
    (SELECT * 
     FROM [DB].[dbo].[Table_1a] 
     WHERE [DB].[dbo].[Table_1a].[Column] = [DB].[dbo].[Table_1].[Column])

Когда я получаю сообщение об ошибке: не удалось связать многоэлементный идентификатор "DB.dbo.Table_1.Column".

Я посмотрел на эту ошибку из Не удалось связать идентификатор из нескольких частей и http://www.sql -server-helper.com / error-messages / msg-4104.aspx , нони один из них не решает мою проблему, так как я не использую JOIN или псевдонимы.Поэтому я не совсем уверен, что делать.

Я использую SQL Server 2017.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете получить все строки из [DB].[dbo].[Table_1a], которые не существуют в [DB].[dbo].[Table_1a], используя левое соединение:

INSERT [DB].[dbo].[Table_1] 
  SELECT t1a.*
  FROM [DB].[dbo].[Table_1a] t1a
  LEFT JOIN [DB].[dbo].[Table_1] t1
  ON t1a.[Column] = t1.[Column]
  WHERE t1.[Column] IS NULL
0 голосов
/ 13 декабря 2018

Проблема в том, что у вас есть две ссылки на предложение FROM на [DB].[dbo].[Table_1a], и вы не стали их псевдонимами.

Так что в предложении WHERE подзапроса (который имеет доступ как к внутренним, так и к внешним запросам, ипоэтому в обоих случаях [DB].[dbo].[Table_1a]) оптимизатор не знает, какое из них вы имеете в виду:

WHERE [DB].[dbo].[Table_1a].[Column] = ...

Если вы дадите два разных псевдонима этим ссылкам таблицы, и выберите одинв предложении WHERE все должно быть в порядке:

INSERT [DB].[dbo].[Table_1] 
SELECT *
FROM [DB].[dbo].[Table_1a] t1
WHERE NOT EXISTS 
    (SELECT * 
     FROM [DB].[dbo].[Table_1a] t2
     WHERE t2.[Column] = [DB].[dbo].[Table_1].[Column])

EDIT:

Другая проблема заключается в том, что вы вставляете в Table_1 записи в Table_1a ГДЕ там не существуетзапись в Table_1a, соответствующая записи в Table_1.

Это не имеет особого смысла.Вероятно, вы хотели вставить 1a записи, которые еще не существуют в 1.Так что, вероятно, вы имели в виду, что это прекрасно работает:

INSERT INTO Table_1
SELECT * FROM Table_1a t2
WHERE NOT EXISTS(
    SELECT * FROM Table_1 t1
    WHERE t1.Col1=t2.Col1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...