0

我想编写一个查询来插入动态值,如果它们已经存在或不存在。到目前为止,我已经尝试过了。

INSERT MTB_AML..tb_aml_codes (aml_code, aml_desc)

    SELECT 'NRA', 'Non-Resident Alien'
    UNION
    SELECT 'DOM', 'Resident Alien'
    FROM MTB_AML..tb_aml_codes t1
    WHERE t1.aml_code NOT IN (SELECT t2.aml_code from MTB_AML..tb_aml_codes t2)

但这仅返回上选择(表中已存在)。我究竟做错了什么?

4

4 回答 4

1

我认为您遇到的问题是,在您的版本中,WHERE 子句仅适用于 UNION 子句中的最后一个 Select

获取你想要的记录

 SELECT 'NRA' AS aml_code, 'Non-Resident Alien' AS aml_desc
    UNION 
 SELECT 'DOM' AS aml_code, 'Resident Alien' AS aml_desc

然后将它们包装为子查询(在示例中别名为 [src]),然后您可以检查哪些在目标表中没有匹配的键(别名为 [dst])

INSERT MTB_AML..tb_aml_codes (aml_code, aml_desc)
SELECT src.aml_code, src.aml_desc
(
    SELECT 'NRA' AS aml_code, 'Non-Resident Alien' AS aml_desc
    UNION 
    SELECT 'DOM' AS aml_code, 'Resident Alien' AS aml_desc
) src
WHERE src.aml_code NOT IN (SELECT dst.aml_code from MTB_AML..tb_aml_codes dst)

就我个人而言,我会用这样的左连接来做,但这取决于你

  INSERT MTB_AML..tb_aml_codes (aml_code, aml_desc)
SELECT src.aml_code, src.aml_desc
FROM
(
    SELECT 'NRA' AS aml_code, 'Non-Resident Alien' AS aml_desc
    UNION 
    SELECT 'DOM' AS aml_code, 'Resident Alien' AS aml_desc
) src
LEFT JOIN MTB_AML..tb_aml_codes dst
ON dst.aml_code = src.aml_code
WHERE dst.aml_code IS NULL

两者都可以,但是如果您必须匹配多列键,则需要使用 join 方法

于 2014-05-09T19:13:12.670 回答
0

您正在对结果集的值进行硬编码,引号表示文字值,您必须需要 COLUMN 名称。

SELECT 'DOM', 'Resident Alien'

你需要有你的 SELECT 像这样:

SELECT T1.ColName, T1.AndAnotherColName
....
于 2014-05-09T18:56:05.937 回答
0

您正在插入与表无关的静态数据MTB_AML..tb_aml_codes。所以你的插入查询可以简化如下

INSERT MTB_AML..tb_aml_codes (aml_code, aml_desc)
VALUES ('NRA', 'Non-Resident Alien'),('DOM', 'Resident Alien')

编辑:

然后您需要检查这些值是否存在,并相应地进行插入,如下所示

IF NOT EXISTS 
(select 1 from MTB_AML..tb_aml_codes where aml_code in('NRA','DOM') 
and aml_desc in ('Non-Resident Alien','Resident Alien'))
BEGIN
INSERT INTO MTB_AML..tb_aml_codes (aml_code, aml_desc)
VALUES ('NRA', 'Non-Resident Alien'),('DOM', 'Resident Alien')
END
于 2014-05-09T18:57:40.667 回答
0

我认为该MERGE声明可用于您的需求。它简洁地完成了你想做的事情。

MERGE MTB_AML..tb_aml_codes AS dest
USING (
    -- place here whatever you want to insert if not already present
    -- I'm using something like what you have in your question since 
    -- that's your example
    SELECT 'NRA', 'Non-Resident Alien'
    UNION
    SELECT 'DOM', 'Resident Alien'
) AS src
ON dest.aml_code = src.aml_code
WHEN NOT MATCHED BY TARGET THEN
    INSERT (aml_code, aml_desc)
    VALUES (src.aml_code, src.aml_desc)
;
于 2014-05-09T19:24:04.873 回答