SQL - 根据查找表中的引用数据更新行

时间:2012-02-29 19:04:28

标签: sql sql-server

我有一个表tbl_english,其中包含“word”列。 我还有一个表tbl_translation,其中包含“german_word”和“english_word”列。

tbl_translation应该是一个查找表,以查看tbl_english'列中是否有任何德语单词“word”

所以我想做的是;

  

对于每个tbl_english.word,迭代   tbl_translation.german_word并查找匹配值。如果匹配   存在,使用值in更新tbl_english.word   来自tbl_translation

中当前行的tbl_translation.english_word

目的是用查找表中的正确翻译替换tbl_english中存在的任何流氓德语单词tbl_translation

到目前为止,我想出的是这个;

UPDATE tbl_english SET word = 
    (SELECT english_word FROM tbl_translation 
        WHERE tbl_english.word = german_word) 
    WHERE word IN
        (SELECT german_word FROM tbl_translation
            WHERE tbl_english.word = german_word )

但是,当第一个子选择产生相同或不同单词的多个实例时,这会失败。有没有一种简单的方法来解决这个问题?

示例:

tbl_english包含; Mädchen 弗劳 男孩 长颈鹿 Baum的

tbl_translation包含(德语,英语); Mädchen,女 Frau,女性

所以在tbl_english中我希望看到以下结果; 女 女 男孩 长颈鹿 Baum的

编辑:并非tbl_english中的每个单词都会在转换表中包含引用行。 Edit2:添加了示例

2 个答案:

答案 0 :(得分:7)

UPDATE e
  SET word = t.english_word
  FROM dbo.tbl_english AS e
  INNER JOIN dbo.tbl_translation AS t
  ON e.word = t.german_word
  WHERE e.word <> t.english_word;

答案 1 :(得分:1)

您是否尝试为子表使用别名?

UPDATE tbl_english SET word = 
(SELECT TOP 1 t.english_word FROM tbl_translation t WHERE tbl_english.word = t.german_word) 
WHERE word IN
(SELECT TOP 1 t.german_word FROM tbl_translation t WHERE tbl_english.word = t.german_word)

我希望我没有误解你的问题。