使用and和子查询更新布尔数据类型

时间:2017-10-12 14:19:26

标签: sql sql-server sql-update

更新布尔数据类型时,我可以在PostgreSQL中执行以下操作:

$legal->card

当我想对SQL Server执行相同操作时出现语法错误。

  

Msg 156,Level 15,State 1,Line 8
关键字附近的语法不正确   '和'

如何在SQL Server中完成相同类型的查询?

2 个答案:

答案 0 :(得分:0)

在SQL Server中:

UPDATE demo
SET ks = 1

因为您的声明id in (select id from demo)表示您希望将此更新应用于所有行。

如果要将此更新限制为某些行,则将添加WHERE子句,如下所示

UPDATE demo
SET ks = 1
WHERE your_condition_is_satisfied

答案 1 :(得分:0)

似乎你的简化示例有点简化了,并且引起了一些混乱。也许这会更好地说明。假设我们有两个表:

tbl_parent

parent_id  parent_name  has_partner  single_parent
---------  -----------  -----------  -------------
1          parent1      true 
2          parent2      false
3          parent3      true 
4          parent4      false
tbl_child

child_id  child_name     parent_id
--------  -------------  ---------
101       parent1child1  1
201       parent2child1  2
202       parent2child2  2

如果我们想填充PostgreSQL中的tbl_parent.single_parent column,我们可以做到

UPDATE tbl_parent 
SET single_parent = (NOT has_partner) AND parent_id IN (SELECT parent_id FROM tbl_child)

导致

parent_id  parent_name  has_partner  single_parent
---------  -----------  -----------  -------------
1          parent1      true         false
2          parent2      false        true
3          parent3      true         false
4          parent4      false        false

SQL Server显然不支持SET表达式中的子查询。但是,我们可以将子查询放在T-SQL UPDATE语句的FROM子句中,如下所示:

UPDATE tbl_parent 
SET single_parent = (~ has_partner) & (child_check.has_children)
FROM 
    tbl_parent 
    INNER JOIN 
    (
        SELECT DISTINCT 
            tbl_parent.parent_id, 
            IIF(tbl_child.parent_id IS NULL, CONVERT(BIT, 'FALSE'), CONVERT(BIT, 'TRUE')) AS has_children
        FROM 
            tbl_parent
            LEFT JOIN
            tbl_child
                ON tbl_parent.parent_id = tbl_child.parent_id
    ) child_check 
        ON tbl_parent.parent_id = child_check.parent_id;