如何编写查询:"如果不存在,则插入不存在的行"只有第三个表的外键

时间:2014-07-24 18:55:46

标签: sql sql-server stored-procedures

我有3张桌子:

资源表:ResourceID,ResourceValue,ProjectName

翻译表:ResourceID,translatedValue,language。(这是保存resourceValue的所有当前翻译的表。基本上,资源表中的一个resourceValue将转换为多语言版本并插入此表。)

TranslationPool:ResourceValue,TranslatedValue,language。(这是一个保存resourceValue的所有类型翻译的池,可能使用也可能不使用)

我想在SQL server中编写一个存储过程,该参数是一个projectName,它将检查该projectName下的所有resourceValue是否在Translation表中有翻译,对于没有翻译的所有resourceValue在翻译表中,插入来自TranslationPool的尊重翻译。

我知道我需要使用merge子句,但我不知道如何编写涉及3个表的merge子句,因为我想从TranslationPool中插入Translation表中不存在的所有翻译,但它们不是通过外键直接连接的。

1 个答案:

答案 0 :(得分:0)

这将为您提供一个良好的开端。你甚至不需要任何mergejoin,你仍然可以实现它。

CREATE PROCEDURE some_procedure
@projectName VARCHAR(100) --Input from the user

AS
BEGIN

DECLARE
@totalRows INT

--What happen is, if the resourceValue is already existed in the Translation_table,
--it will return count more than 0
SET @totalRows = (SELECT count(resourceValue) FROM Translation_table WHERE resourceValue = @projectName)

--And if that happen, you can simply display some message saying that the resourceValue  has already existed
IF (@totalRows > 0)
BEGIN   
--Already exist
END

--If the count is 0, meaning there is nothing, then you will "copy" from the Pool
ELSE
BEGIN
INSERT INTO Translation_table
SELECT FROM TranslationPool WHERE resourceValue = @projectName
END

END