SQL Server (T-SQL) Вставьте, если не существует - PullRequest
0 голосов
/ 01 февраля 2010

Вопрос

Как я могу изменить приведенный ниже код SQL, чтобы гарантировать, что вставки в "dbo.tblBootStrapperInstruments" происходят, только если они еще не существуют?

код

INSERT INTO dbo.tblBootStrapperInstruments (CCY, Instrument, Tenor)
SELECT CCY,Instrument,Gridpoint FROM dbo.Feed_Murex_Intraday_DF mx WHERE NOT EXISTS 
(SELECT * FROM dbo.tblBootStrapperInstruments bs
WHERE bs.CCY = mx.CCY
AND bs.Instrument = mx.Instrument
AND bs.Tenor = mx.Gridpoint) 

Ответы [ 3 ]

1 голос
/ 01 февраля 2010

Вот как бы я это сделал.

INSERT INTO dbo.tblBootStrapperInstruments (CCY, Instrument, Tenor) 
SELECT mx.CCY,mx.Instrument,mx.Gridpoint FROM dbo.Feed_Murex_Intraday_DF mx
LEFT OUTER JOIN dbo.tblBootStrapperInstruments bs 
ON bs.CCY = mx.CCY 
AND bs.Instrument = mx.Instrument 
AND bs.Tenor = mx.Gridpoint
WHERE bs.CCY IS NULL
0 голосов
/ 01 февраля 2010

Если ваш вариант базы данных и версия поддерживает MERGE, вы можете использовать это (MERGE был добавлен в SQL Server 2005). Синтаксис немного неуклюжий, потому что он действительно предназначен для загрузки данных, выбирая из другой таблицы.

В этом примере используется Oracle (потому что это то, что у меня есть).

SQL> merge into customer
  2      using ( select 6 as id
  3                     , 'Ella' as forename
  4                     , 'Chip' as surname
  5                     , '1234 Telepath Drive' as address_1
  6                     , 'Milton Lumpky' as address_2
  7                     , 'ML1 4KJ' as postcode
  8                    ,  add_months (sysdate, -235) as date_of_birth
  9               from dual ) t
 10      on (t.id = customer.id )
 11  when not matched then
 12      insert (id, forename, surname, address_1, address_2, postcode, date_of_birth)
 13      values (t.id, t.forename, t.surname, t.address_1, t.address_2, t.postcode, t.date_of_birth)
 14  /

1 row merged.

SQL> commit;

Commit complete.

SQL>

Если мы снова запустим тот же запрос (ID - это первичный ключ), он не потерпит неудачу, он просто объединит одну строку ...

SQL> merge into customer
  2      using ( select 6 as id
  3                     , 'Ella' as forename
  4                     , 'Chip' as surname
  5                     , '1234 Telepath Drive' as address_1
  6                     , 'Milton Lumpky' as address_2
  7                     , 'ML1 4KJ' as postcode
  8                    ,  add_months (sysdate, -235) as date_of_birth
  9               from dual ) t
 10      on (t.id = customer.id )
 11  when not matched then
 12      insert (id, forename, surname, address_1, address_2, postcode, date_of_birth)
 13      values (t.id, t.forename, t.surname, t.address_1, t.address_2, t.postcode, t.date_of_birth)
 14  /

0 rows merged.

SQL>  

Сравните и сравните с лысой вставкой ...

SQL>   insert into customer (id, forename, surname, address_1, address_2, postcode, date_of_birth)
  2  values ( 6, 'Ella', 'Chip', '1234 Telepath Drive', 'Milton Lumpky', 'ML1 4KJ',add_months (sysdate, -235) )
  3  /
    insert into customer (id, forename, surname, address_1, address_2, postcode, date_of_birth)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.CUS_PK) violated


SQL>
0 голосов
/ 01 февраля 2010

Какие СУБД вы используете? MySQL? MSSQL? SQLite

В MySQL у вас есть два варианта. Вы можете добавить уникальный индекс в значения вставки и выбрать оператор REPLACE или использовать ON DUPLICATE KEY UPDATE .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...