Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 - Fatal编程技术网

SQL查询:如何根据查找表更改值?

SQL查询:如何根据查找表更改值?,sql,Sql,[更新:我正在使用MySQL 4.1.25] 我认为这一定是一件简单的事情,但我是一个SQLNoob,需要一些帮助。我有一个类似以下内容的查找表: 查找表 键1,值1 键2,值2 键3,值3 ... 凯恩,瓦伦 然后我有另一个表,其中有一列中重复的键的随机列表,我需要在相应的列中添加相关的值 例如,第二个表可能是: 第二张桌子 键3? 键1? 键1? 钥匙40 我需要用lookup_表中的值替换第二个_表中的?s,如下所示: 第二张表格已更新 键3,值3 键1,值1 键1,值1 键40,值40

[更新:我正在使用MySQL 4.1.25]

我认为这一定是一件简单的事情,但我是一个SQLNoob,需要一些帮助。我有一个类似以下内容的查找表:

查找表 键1,值1 键2,值2 键3,值3 ... 凯恩,瓦伦

然后我有另一个表,其中有一列中重复的键的随机列表,我需要在相应的列中添加相关的值

例如,第二个表可能是:

第二张桌子 键3? 键1? 键1? 钥匙40

我需要用lookup_表中的值替换第二个_表中的?s,如下所示:

第二张表格已更新 键3,值3 键1,值1 键1,值1 键40,值40


这似乎是一个简单的SQL查询应该解决的问题。有什么建议吗?

除了其他答案,您还可以通过加入

update second_table 
set value = 
(select value from lookup_Table
where lookup_table.key = second_table.key)
UPDATE second_table
SET    value = L.value
FROM   second_table S join lookup_table L on S.key = L.key

在使用联接更新时,我更喜欢以下语法,而不是执行子查询。它允许您在更新结果之前查看结果,并知道查询是否正确

select
   st.key,
   lt.value
--update st set value = lt.value
from
   second_table st
   inner join lookup_table lt on
       st.key = lt.key
请注意,当您准备好更新时,请从update on(更新)向下选择所有内容

更新:多亏了tekBlues,我发现上述功能至少可以在SQL Server和Oracle上运行。MySQL有一点不同的语法:

update
    second_table st
    inner join lookup_table lt on
        st.key = lt.key
set
    st.value = lt.value

这些都是大型RDBMS,所以希望其中一个会有所帮助。

如果查找表是一个查询,那么可以使用一个选项


据我所知,这种语法在所有数据库中都不可用engines@tekBlues当前位置给我的印象是ANSI。什么样的数据库不可行?如果是这样的话,我不想再推荐了!无论如何,当使用SQL Server时,我更喜欢它,至少在INFORMIX中,你可以做到,我确信这一点。这是一个巨大的痛苦,因为当你想更新多个字段时,你必须使用这个可怕的语法:updatetableseta,b=select…抱歉。我的意思是,在INFORMIX中,您不能使用更新。。From你能说明你也在使用哪个sql平台吗?@Greg:为什么要这样去规范化呢。线索在名称中:与其在第二个_表中冗余存储值,不如在lookup_表中查找值?这可以防止出现异常情况,例如,如果value1在lookup_表中被更改为其他内容,但在第二个_表中没有更改,该怎么办?@onedaywhen:这一点很好,但这是从一个系统迁移到另一个系统的一部分。第二个_表中的关键字段最终将被删除。@tekBlues:谢谢。我认为,如果select语句生成一个唯一的行,那么它会工作,但是由于它返回多行,set语句会抛出一个错误。Eric的连接处理多行。
WITH nested_table AS 
(SELECT key, MAX(valA) as valA, MAX(valB) as valB 
 FROM .. 
 ... JOIN/GROUP BY ...
)
UPDATE second_table 
SET valA = nested_table.valA, valB = nested_table.valB 
FROM nested_table 
WHERE nested_table.key = second_table.key;