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

どちらも機能しますが、複数列のキーで一致する必要がある場合は、結合方法を使用する必要があります

于 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 に答える