2016-08-11 2 views
1
FirstTable 

ColumnOne | TabletwoCol | TablethreeColumn | 
1  | 2   | 5    | 
2  | 3   | 6    | 
3  | 8   | 10    |  

SecondeTable (TableTwo) 

TabletwoCol | Coln | 
2   | ABC | 
3   | lmn | 
8   | as | 
1515  | addd | 

Я хочу использовать Merge удалить, чтобы удалить из моего Seconde таблицы со ссылкой Tabletwocol
т.е. от SecondeTable (TableTwo) следующие строки должны удаляютсяпростой Merge удалить неудачу

2   | ABC | 
    3   | lmn | 
    8   | as | 

должны удаляются

Я написал

MERGE SecondeTable PB USING 
      (SELECT DD.TabletwoCol FROM FirstTable DD) temptable 
           ON PB.TabletwoCol =temptable.TabletwoCol 
           WHEN MATCHED THEN 
           DELETE; 

Я не понимаю, что происходит worng no eerro coming

+0

вы можете разместить набор данных из таблиц источника и назначения – scsimon

+0

добавлены некоторые данные и упрощена ожидается выход –

+1

Почему вы должны использовать слияние здесь? Это простой оператор delete, и слияние просто не нужно. –

ответ

0

Если я правильно понимаю, вы пытаетесь удалить из SecondTable, если есть совпадение в FirstTable. Попробуйте

--DROP TABLE #FirstTable; 
--DROP TABLE #SecondTable; 
CREATE TABLE #FirstTable 
    (
     ColumnOne INT 
    , TabletwoCol INT 
    , TablethreeColumn INT 
    ); 

INSERT INTO #FirstTable 
     (ColumnOne 
     , TabletwoCol 
     , TablethreeColumn 
     ) 
VALUES (1 -- ColumnOne - int 
     , 2 -- TabletwoCol - int 
     , 5 -- TablethreeColumn - int 
     ); 
CREATE TABLE #SecondTable 
    (
     TabletwoCol INT 
    , Coln CHAR(5) 
    ); 
INSERT INTO #SecondTable 
     (TabletwoCol, Coln) 
VALUES (2 -- TabletwoCol - int 
      , 'ABC' -- Coln - char(5) 
     ), 
     (3 -- TabletwoCol - int 
      , 'def' -- Coln - char(5) 
     ); 
SELECT * 
FROM #FirstTable; 

SELECT * 
FROM #SecondTable; 

MERGE #SecondTable AS Tgt 
USING 
    (SELECT TabletwoCol 
     FROM  #FirstTable 
    ) AS Src 
ON Src.TabletwoCol = Tgt.TabletwoCol 
WHEN MATCHED THEN 
    DELETE; 

SELECT * 
FROM #FirstTable; 
SELECT * 
FROM #SecondTable; 
+0

Drishya это выглядит хорошо, но для меня в моих реальных данных он выполнен, и он не удался, а не удалил ни одну строку –

+0

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

+0

Я протестировал сценарий в наборе данных, который вы предоставили, и это сработало. Проверьте, нет ли у вас чего-то из сценария, который я опубликовал, или если у вас нет соответствия в таблицах, на которых вы используете эту логику. – Drishya1

0

Я не знаю, почему он не работает. Мне все хорошо. Может быть, вы должны попробовать использовать DELETE

DELETE PB 
FROM SecondeTable AS PB 
INNER JOIN FirstTable DD 
    ON PB.TabletwoCol = DD.TabletwoCol; 
+0

спасибо за быстрый ответ @vercelli, но я специально хочу это сделать слиянием –

+1

@PushkarPhule. OK: делает 'select * from SecondeTable AS PB INNER JOIN FirstTable DD ON PB.TabletwoCol = DD.TabletwoCol;' вернуть что-нибудь? – vercelli

Смежные вопросы