Как добавить «НЕ СУЩЕСТВУЕТ» в мой SQL-запрос?

Мне нужно вставить новую строку из временной таблицы (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)

Я попробовал «ЕСЛИ НЕ СУЩЕСТВУЕТ» в начале запроса и/или «ГДЕ НЕ СУЩЕСТВУЕТ» в конце запроса.

Я продолжаю получать повторяющиеся строки в целевой таблице.

Я должен был добавить, что Drug_Identifier, Identifier_Type, Drug_Group, Brand_Generic останутся прежними при добавлении новой строки, но дата вступления в силу изменится. По сути, я хочу снова добавить ту же строку, но с новой датой вступления в силу.

Danica Mattson 05.07.2024 23:33

Можете ли вы опубликовать свой код без комментариев sql-кода? Очень сложно понять, что вы имеете в виду под «попыткой в ​​начале» и «попыткой в ​​конце», когда вы пробовали только комментарии. Закомментированный код ничего не сделает, и нет смысла его пробовать.

topsail 05.07.2024 23:36

Что это за СУБД? Пожалуйста, отметьте это, так как ответы могут существенно различаться в зависимости от каждого

esqew 05.07.2024 23:38

Хотя, кажется, я понимаю, что вы имеете в виду...

topsail 05.07.2024 23:39

Я думаю, проблема в том, что ваши проверки «если не существует» или «где существует» слишком широки. Если что-то существует (или ничего не существует), все строки вставляются (или не вставляются). Вам нужна проверка для каждой строки, которая должна быть вставлена ​​(или не вставлена). С технической точки зрения вы, вероятно, собираетесь использовать здесь коррелированный подзапрос — проверку существования строки за строкой.

topsail 05.07.2024 23:41

Нам будет проще помочь вам с помощью воспроизводимого примера — скрипт создания таблицы, который создает несколько таблиц и добавляет в них некоторые данные, а затем ваш образец запроса с образцами результатов (по сути — чтобы мы могли протестировать запрос и протестировать предлагаемый вариант). решение).

topsail 05.07.2024 23:48

Также логика нуждается в ясности. Почему в одной из ваших попыток проверки «существует» используется дата вступления в силу, а в других — нет? На этот вопрос очень трудно ответить в его нынешнем виде.

topsail 05.07.2024 23:52

Сделайте так, чтобы вам было легко помочь – упростите свой пример. Предоставьте полный минимально воспроизводимый пример.

jarlh 06.07.2024 11:08
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
4
8
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если совпадения по уникальному ключу нет, вы должны решить, какие столбцы включать при сравнении строк из каждой таблицы. Например, следующее будет идентифицировать строки из новой таблицы, которых нет в существующей таблице:

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.

Другие вопросы по теме