我有两张桌子。一个是简单的字符串/ ID查找:
StrTable:
str_key String 0 'a' 1 'b'
其中字符串是唯一的。另一个更复杂,包括共享的string_id
ValTable:
str_key other_key val 0 0 1.234 0 1 1.567 1 0 1.890
现在,我想对ValTable进行更新,使用我查找的字符串通过StrTable获取str_key。简单的更新将是:
UPDATE ValTable SET val = 2.124 WHERE str_key = 0 AND other_key = 1 LIMIT 1
IF @@ROWCOUNT=0 INSERT INTO ValTable VALUES (0,1,2.124);
那么如何修改它以包括用一些字符串'a'查找str_key?我假设我需要加入,但我从未在更新中加入。或者我可以在where子句中添加更多内容吗?
答案 0 :(得分:14)
这是您需要的语法:
UPDATE v
SET val = 2.124
FROM ValTable v
INNER JOIN
StringTable s
ON v.str_key = s.str_key
WHERE s.String = 'a'
AND v.other_key = 1
IF @@ROWCOUNT = 0
BEGIN
INSERT
INTO ValTable
SELECT str_key, 1, 2.124
FROM StringTable
WHERE String = 'a'
END
答案 1 :(得分:1)
David M的上述示例是有效且有效的。根据表的大小,您可能希望避免“盲更新”,因为这可能会导致非常大的表出现性能问题。请注意IF EXISTS()中的表提示。
IF EXISTS(
SELECT
*
FROM
ValTable v WITH(NOLOCK)
INNER JOIN StringTable s WITH(NOLOCK) ON v.str_key = s.str_key
WHERE
s.String = 'a'
AND v.other_key = 1
)
BEGIN
UPDATE
v
SET
val = 2.124
FROM
ValTable v
INNER JOIN StringTable s ON v.str_key = s.str_key
WHERE
s.String = 'a'
AND v.other_key = 1
END
ELSE
BEGIN
INSERT INTO ValTable
--(You should define your columns here, You didn't provide a sample schema so I don't know what your columns are.)
--(Col1,COl2,COl3,etc...)
SELECT
str_key, 1, 2.124
FROM
StringTable
WHERE
String = 'a'
END