Мне нужно вставить новую строку из временной таблицы (temp), если она не существует в таблице (t). У меня проблема в том, что нет первичного ключа, и временная таблица усекается каждый раз, когда она импортируется. Я объединяю данные из temp в t с помощью хранимой процедуры, но хочу импортировать только несуществующие строки. Я попробовал в начале запроса на вставку:
IF NOT EXISTS (SELECT *
FROM FPS.Predictive_Acquisition_Cost_NEW sa
LEFT JOIN FPS_LZ.FPS.Predictive_Acquisition_Cost lz
ON lz.Drug_Identifier = sa.Drug_Identifier
WHERE sa.Drug_Identifier = lz.Drug_Identifier
AND lz.Effective_Date <> sa.Effective_Date)
и в конце запроса на вставку:
WHERE NOT EXISTS(SELECT * FROM FPS.Predictive_Acquisition_Cost_NEW)
Полный запрос на вставку для лучшего понимания:
--IF NOT EXISTS (SELECT * FROM FPS.Predictive_Acquisition_Cost_NEW sa LEFT JOIN FPS_LZ.FPS.Predictive_Acquisition_Cost lz ON lz.Drug_Identifier = sa.Drug_Identifier WHERE sa.Drug_Identifier = lz.Drug_Identifier AND lz.Effective_Date <> sa.Effective_Date)
INSERT INTO FPS_SA.FPS.Predictive_Acquisition_Cost_NEW
(
Drug_Identifier,
Identifier_Type,
Drug_Group,
Brand_Generic,
PAC,
PAC_Low,
PAC_High,
PAC_Retail,
Error_Code,
Effective_Date,
End_Date,
PAC_Model_Version
)
SELECT lz.Drug_Identifier,
lz.Identifier_Type,
lz.Drug_Group,
lz.Brand_Generic,
lz.PAC,
lz.PAC_Low,
lz.PAC_High,
lz.PAC_Retail,
lz.Error_Code,
lz.Effective_Date,
lz.End_Date,
lz.PAC_Model_Version
FROM FPS_LZ.fps.Predictive_Acquisition_Cost lz LEFT OUTER JOIN FPS_SA.FPS.Predictive_Acquisition_Cost sa ON lz.Drug_Identifier = sa.Drug_Identifier`
--WHERE NOT EXISTS(SELECT * FROM FPS.Predictive_Acquisition_Cost_NEW)
Я попробовал «ЕСЛИ НЕ СУЩЕСТВУЕТ» в начале запроса и/или «ГДЕ НЕ СУЩЕСТВУЕТ» в конце запроса.
Я продолжаю получать повторяющиеся строки в целевой таблице.
Можете ли вы опубликовать свой код без комментариев sql-кода? Очень сложно понять, что вы имеете в виду под «попыткой в начале» и «попыткой в конце», когда вы пробовали только комментарии. Закомментированный код ничего не сделает, и нет смысла его пробовать.
Что это за СУБД? Пожалуйста, отметьте это, так как ответы могут существенно различаться в зависимости от каждого
Хотя, кажется, я понимаю, что вы имеете в виду...
Я думаю, проблема в том, что ваши проверки «если не существует» или «где существует» слишком широки. Если что-то существует (или ничего не существует), все строки вставляются (или не вставляются). Вам нужна проверка для каждой строки, которая должна быть вставлена (или не вставлена). С технической точки зрения вы, вероятно, собираетесь использовать здесь коррелированный подзапрос — проверку существования строки за строкой.
Нам будет проще помочь вам с помощью воспроизводимого примера — скрипт создания таблицы, который создает несколько таблиц и добавляет в них некоторые данные, а затем ваш образец запроса с образцами результатов (по сути — чтобы мы могли протестировать запрос и протестировать предлагаемый вариант). решение).
Также логика нуждается в ясности. Почему в одной из ваших попыток проверки «существует» используется дата вступления в силу, а в других — нет? На этот вопрос очень трудно ответить в его нынешнем виде.
Сделайте так, чтобы вам было легко помочь – упростите свой пример. Предоставьте полный минимально воспроизводимый пример.
Если совпадения по уникальному ключу нет, вы должны решить, какие столбцы включать при сравнении строк из каждой таблицы. Например, следующее будет идентифицировать строки из новой таблицы, которых нет в существующей таблице:
SELECT
t.*
FROM FPS.Predictive_Acquisition_Cost_NEW t
WHERE NOT EXISTS(SELECT NULL
FROM FPS_LZ.fps.Predictive_Acquisition_Cost lz
WHERE lz.Drug_Identifier = t.Drug_Identifier
AND lz.Identifier_Type = t.Identifier_Type
AND lz.Drug_Group = t.Drug_Group
AND lz.Brand_Generic = t.Brand_Generic
AND lz.PAC = t.PAC
AND lz.PAC_Low = t.PAC_Low
AND lz.PAC_High = t.PAC_High
AND lz.PAC_Retail = t.PAC_Retail
AND lz.Error_Code = t.Error_Code
AND lz.Effective_Date = t.Effective_Date
AND lz.End_Date = t.End_Date
AND lz.PAC_Model_Version = t.PAC_Model_Version
)
И наоборот, определите строки из существующей таблицы, которых нет в новой таблице, просто измените ссылки на таблицу:
SELECT
lz.*
FROM FPS_LZ.fps.Predictive_Acquisition_Cost lz
WHERE NOT EXISTS(SELECT NULL
FROM FPS.Predictive_Acquisition_Cost_NEW t
WHERE lz.Drug_Identifier = t.Drug_Identifier
AND lz.Identifier_Type = t.Identifier_Type
AND lz.Drug_Group = t.Drug_Group
AND lz.Brand_Generic = t.Brand_Generic
AND lz.PAC = t.PAC
AND lz.PAC_Low = t.PAC_Low
AND lz.PAC_High = t.PAC_High
AND lz.PAC_Retail = t.PAC_Retail
AND lz.Error_Code = t.Error_Code
AND lz.Effective_Date = t.Effective_Date
AND lz.End_Date = t.End_Date
AND lz.PAC_Model_Version = t.PAC_Model_Version
)
Суть в том, что для использования NOT EXISTS(subquery)
этот подзапрос должен содержать предложениеwhere с предикатами, которые сравнивают значения из обеих таблиц. В частности, обратите внимание, что каждый предикат в предложенииwhere относится к lz (существующему) и t (новому).
Примечание: в подзапросе можно использовать «select null», «select *» или «select 1», поскольку это не повлияет на результат. Важнейшей частью подзапроса в конструкции NOT EXISTS является предложениеwhere.
Я должен был добавить, что Drug_Identifier, Identifier_Type, Drug_Group, Brand_Generic останутся прежними при добавлении новой строки, но дата вступления в силу изменится. По сути, я хочу снова добавить ту же строку, но с новой датой вступления в силу.