Как удалить несколько строк с 2 столбцами в качестве составного первичного ключа - PullRequest
0 голосов
/ 06 августа 2020

Например, у нас есть следующий запрос, который работает в Oracle, однако он не работает на SQL Server. Как его переписать для сервера SQL?

delete from cpi
where (countryid, year) in (('AD', 2010), ('AF', 2009), ('AG', 1992))

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Это намного неуклюже по сравнению, но вы можете использовать конструктор значений таблицы , чтобы создать свой список кортежей в предложении EXISTS и сопоставить его таким образом, например

DELETE FROM cpi
WHERE EXISTS 
      ( SELECT  1
        FROM (VALUES ('AD', 2010), ('AF', 2009), ('AG', 1992)) AS v (countryid, year)
        WHERE v.countryid = cpi.countryid
        AND v.year = cpi.year
      );
0 голосов
/ 06 августа 2020

Вы можете express это использовать конструктор табличного значения. . . в delete:

delete from cpi
    from (values ('AD', 2010), ('AF', 2009), ('AG', 1992) ) v(countryid, year)
    where cpi.countryid = v.countryid and cpi.year = cpi.year;

Подзапрос не требуется.

0 голосов
/ 06 августа 2020

Если на самом деле всего несколько пар, просто:

 delete from cpi
 where (countryid = 'AD' and year = 2010) or (countryid = 'AF' and year = 2009) or (countryid = 'AG' and year = 1992)

Или, если их больше, может быть что-то вроде:

 delete from cpi
 where countryid + '|' + convert(varchar(4),year) in ('AD|2010','AF|2009','AG|1992')
...