【问题标题】:conditional UPDATE sqlite statement有条件的 UPDATE sqlite 语句
【发布时间】:2015-01-07 14:07:09
【问题描述】:

我正在第一次使用 sqlite
我在以下问题上需要帮助
我有2张桌子如下

测试1


键值
一个    1
b    2
c    3
e    7
f    41
j    52

测试2


键值
一个    null
b    null
c    null
d    null
e    null
f    null
g    null
j    null

我正在尝试更新 test2 的值,如果表 test2 = test1 中的键,则更新值,否则为 null

预期的输出是这样的

测试2


键值
一个    1
b    2
c    3
d    null
e    7
f    41
g    null
j    52

我试试这个查询

插入 test2([值]) 选择 test1.value
来自 test1, test2
其中test2.value=test1.value;

但它不工作
如何解决这个问题?

【问题讨论】:

  • 您不必使用 HTML 来格式化您的问题。代码 sn-ps 可以使用四个空格缩进。

标签: sql database sqlite


【解决方案1】:

(假设您的意思是条件更新,而不是插入)

幸运的是,您似乎需要在连接失败的情况下将test2 重置为 null,因此您可以使用指定为子查询的集合进行更新:

update test2
set value = 
(SELECT t1.value
 FROM test1 t1 where t1.key = test2.key
 LIMIT 1);

SqlFiddle:

LIMIT 将确保只返回一行,但如果 test1 和 test2 之间的关系不是 1:1,您将需要应用逻辑来确定如何连接这两个表。

【讨论】:

  • 嘿,感谢您的回答,但存在问题,它用第一个匹配值填充表 test2 的所有行而不是空值。你是对的,我要求有条件更新而不是插入:)
  • ?我不能按照 SqlFiddle 重复。您可能会做的是显式地为内部测试表 (t1) 设置别名 - 这将更容易识别哪个列属于哪个表。我还用一个保留原始值的变体更新了小提琴(即,如果没有匹配项,它不会用 null 覆盖)。我不太确定您在这种情况下想要什么
【解决方案2】:

试试这个,不知道sqllite语法但应该是这样的。因为你的 test2 表已经有空值所以你只需要更新 key 值与 test1 表匹配的值列

MSSQL:-

UPDATE R 
SET R.[value] = p.[value]
FROM dbo.test2 AS R
INNER JOIN dbo.test1 AS P 
       ON R.[key] = P.[key] 

我只是关注this然后我看到sql lite不支持在更新语句中加入,但你可以在子查询中使用

SQLLITE

UPDATE test2 SET [value] = ( 
             SELECT [value] FROM test1 WHERE test1.key = test2.key)

【讨论】:

    【解决方案3】:

    试试这个

    更新测试2 设置值 = (选择 test1.value 从测试1 WHERE test2.key =test1.key) ;

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2021-07-23
      • 2019-05-26
      • 2014-10-30
      • 2016-06-03
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多