Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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使用复合主键更新表中除某些行以外的所有行_Sql_Composite Key_Except - Fatal编程技术网

SQL使用复合主键更新表中除某些行以外的所有行

SQL使用复合主键更新表中除某些行以外的所有行,sql,composite-key,except,Sql,Composite Key,Except,我正在努力处理SQL语句 我想用复合主键更新表中除某些行以外的所有行 这就是我现在所做的: UPDATE Products SET Active = 0 _ 这很管用,但我不喜欢。我希望能一次成功 在SQL中有这样做的方法吗?您的意思是: UPDATE Products SET Active = CASE WHEN (Id_A = 1 AND Id_B = 1 AND Id_C = 1) OR (Id_A = 1 AND Id_B = 2 AND Id_C = 1) O

我正在努力处理SQL语句

我想用复合主键更新表中除某些行以外的所有行

这就是我现在所做的:

UPDATE Products SET Active = 0
_

这很管用,但我不喜欢。我希望能一次成功


在SQL中有这样做的方法吗?

您的意思是:

UPDATE Products SET Active = CASE WHEN
      (Id_A = 1 AND Id_B = 1 AND Id_C = 1) OR
      (Id_A = 1 AND Id_B = 2 AND Id_C = 1) OR
      (Id_A = 5 AND Id_B = 8 AND Id_C = 3) OR
       .
       .
       .
       THEN 1 ELSE 0 END

能否在update语句中使用大小写表达式

差不多

UPDATE Products
    set Active = CASE WHEN (Id_A = 1 AND Id_B = 1 AND Id_C = 1) THEN 1 
                      WHEN (Id_A = 1 AND Id_B = 2 AND Id_C = 1) THEN 1                         
                      .
                      .
                      . 
                      ELSE 0 END

在某些SQL产品中,您可以进一步简化
CASE
中的语法,将多个
删除为
中的简单

UPDATE Products 
SET Active = CASE WHEN
      (Id_A, Id_B, Id_C) IN
      ( (1, 1, 5), (1, 2, 1), (5, 8, 3) ... ) 
             THEN 1 ELSE 0 
             END ;

另一个要考虑的是,如果表有很多行(如数百万或十亿),并且只有一小部分被设置为<代码> Active=1 ,那么更新的完成可能是更有效的,这是2个语句,类似于从一开始就有的,假设您在<代码>(Active)上有索引。(或

(Active=1)
上的部分索引):


为什么不把不应该更新的行放进去呢?例外情况是什么?什么数据库系统,哪个版本?SQL只是结构化查询语言——一种被许多数据库系统使用的语言,但不是一种数据库产品……了解您使用的是什么数据库系统真的很有帮助……我想他想减少这个数量我想他希望根据条件+1在一次更新中加入0/1,但是@JonList在你的查询中,你也会一次完成所有的更新,还是你做了很多更新?我做了两次更新(两次都是从最初的帖子中提出的查询)。我只知道哪些产品需要激活,所以我停用数据库中的所有内容,然后激活我知道需要激活的产品。不幸的是,我的mssql不喜欢这一个。不过我喜欢它的清洁度
UPDATE Products 
SET Active = CASE WHEN
      (Id_A, Id_B, Id_C) IN
      ( (1, 1, 5), (1, 2, 1), (5, 8, 3) ... ) 
             THEN 1 ELSE 0 
             END ;
UPDATE Products SET Active = 0 WHERE Active = 1 ;

UPDATE Products SET Active = 1 WHERE ... ;