Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何删除以2列作为复合主键的多行_Sql_Sql Server_Sql Delete - Fatal编程技术网

Sql 如何删除以2列作为复合主键的多行

Sql 如何删除以2列作为复合主键的多行,sql,sql-server,sql-delete,Sql,Sql Server,Sql Delete,例如,我们有一个在Oracle中工作的查询,但是它在SQL Server中不工作。我们如何为SQL server重写它 delete from cpi where (countryid, year) in (('AD', 2010), ('AF', 2009), ('AG', 1992)) 相比之下,它要笨重得多,但是您可以使用来在EXISTS子句中创建元组列表,并以这种方式进行匹配,例如 DELETE FROM cpi WHERE EXISTS ( SELECT 1

例如,我们有一个在Oracle中工作的查询,但是它在SQL Server中不工作。我们如何为SQL server重写它

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

相比之下,它要笨重得多,但是您可以使用来在
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
      );

如果真的只有几对,只需:

 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')

您可以使用表值构造函数来表示它。在
删除中

delete from cpi
    from (values ('AD', 2010), ('AF', 2009), ('AG', 1992) ) v(countryid, year)
    where cpi.countryid = v.countryid and cpi.year = cpi.year;
不需要子查询