2013-08-15 3 views

ответ

2

Ваше описание очень короткое, но похоже, что вы хотите сделать заявление MERGE.

http://technet.microsoft.com/en-us/library/bb510625.aspx

который может быть использован для вставки/обновления/удаления на основе данных, если существует или не все в одном заявлении.

0

Вы имеете в виду что-то вроде этого?

insert into t(col) 
    select 'value' 
    where not exists (select 1 from t where col = 'value'); 

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

2

Предполагаемые значения, которые вы хотите вставить, являются переменными.

Вы можете использовать IF NOT EXISTS:

IF NOT EXISTS (SELECT * FROM Table1 WHERE Col1 = @Val1 AND Col2 = @Val2) 
INSERT INTO Table1 (Col1, COl2) VALUES (@Val1, @Val2) 

или вы можете использовать SELECT..WHERE с EXISTS

INSERT INTO Table1 (Col1, COl2) 
SELECT @Val1, @Val2 
WHERE NOT EXISTS (SELECT * FROM Table1 WHERE Col1 = @Val1 AND Col2 = @Val2) 

или, возможно, еще несколько методов (NOT IN, LEFT JOIN, MERGE ...)

0

Попробуйте следующее:

insert into target_table (col1, col2, ...) 
select col1, col2, ... 
from source_table 
where col_x not in (
    select col_y from target_tabke where col_y is not null) 
or (col_x is null and not exists (
    select * from target_table where col_y is null)) 
1

Для SQL Server 2008 можно использовать MERGE statement таким образом:

DECLARE @Orders TABLE(
    OrderID INT PRIMARY KEY, 
    Customer NVARCHAR(50) NOT NULL 
); 

INSERT @Orders(OrderID,Customer) 
VALUES(1,'A'),(2,'B'),(3,'A'); 

MERGE @Orders trg -- Target table 
USING (VALUES(1,'A new name'),(4,'D')) src(OrderID,NewCustomer) -- Source table 
ON  trg.OrderID=src.OrderID 
WHEN MATCHED THEN -- If one rows exists in both table then UPDATE target table with the new Customer name 
     UPDATE SET Customer=src.NewCustomer 
WHEN NOT MATCHED BY TARGET THEN -- If one row doesn't exists in target table then INSERT that row 
     INSERT (OrderID,Customer) 
     VALUES (src.OrderID,src.NewCustomer); 

SELECT * 
FROM @Orders o; 

Результаты:

OrderID  Customer 
----------- ---------- 
1   A new name -- <-- row updated 
2   B 
3   A 
4   D   -- <-- row inserted 
1

Вы можете использовать левый или правый присоединиться, например,

WITH SourceTable AS 
(
    SELECT 
    * 
    FROM (VALUES 
      ('A', 1) 
      ,('A', 2) 
      ,('B', 1) 
      ,('C', 10)) nTable(nCol1, nCol2) 
) 
SELECT 
* 
INTO #SourceTable 
FROM SourceTable; 

WITH NewRows AS 
(
    SELECT 
    * 
    FROM (VALUES 
      ('A', 2) 
      ,('A', 3) 
      ,('B', 1) 
      ,('C', 11)) nTable(nCol1, nCol2) 
) 
INSERT #SourceTable 
(nCol1 
,nCol2) 
SELECT 
n.nCol1 
,n.nCol2 
FROM #SourceTable s 
RIGHT JOIN NewRows n 
ON s.nCol1=n.nCol1 
AND s.nCol2=n.nCol2 
WHERE s.nCol1 IS NULL;