Select

如何在 select 語句給出唯一值時多次執行 insert 語句?

  • May 14, 2017

DB火鳥。

我有以下聲明

SELECT a.ID FROM CLIENTS a

我希望我的 INSERT 語句到另一個表中以使用每個值,例如

INSERT INTO BANKS (ID, NR, MONEY)
VALUES (
  gen_id(gen_name, 1), 
  "there should be client ID from the SELECT statement above", 
  3000
)

我可以通過一個聲明來實現這一目標嗎?

為此,您可以使用insert ... select

insert into banks(ID, NR, MONEY)
select 
  gen_id(gen_name, 1), 
  ID, 
  3000
from CLIENTS

如果您有一個觸發器在CLIENTS插入時生成 ID,或者 - Firebird 3 -ID是一個標識列,那麼您可以將其簡化為:

insert into banks(NR, MONEY)
select 
  ID, 
  3000
from CLIENTS

你的問題有點不清楚。我更像是一個 Sql Server 人,但我相信 Firebird 支持 ROW_NUMBER 函式。以下是使用該函式自動遞增的 Sql Server 範例。

DECLARE @Client TABLE (ID INT);
DECLARE @Banks TABLE (ID INT,NR INT,MONEY DECIMAL(11, 2));

INSERT INTO @Client (ID)
VALUES (1),(2),(3);

INSERT INTO @Banks (ID,NR,MONEY)
SELECT 100 + ROW_NUMBER() OVER (ORDER BY id) AS ID,0 AS NR,0 AS MONEY
FROM @Client;

SELECT *
FROM @Banks;

如果您只想在 Banks 表中為 Client 表中的每個相應行插入一行,我認為一個簡單的 INSERT/SELECT 語句會起作用:

INSERT INTO BANKS(ID, NR, MONEY)
SELECT ID, 0, 0 FROM CLIENT;

如果您的意圖是將客戶端的每一行(其中客戶端 ID 成為 BANK 上的 NR 列)插入 BANK,並且您想“自動增加”BANK 上的 ID,那麼這應該可以:

DECLARE @Client TABLE (ID INT);
DECLARE @Banks TABLE (ID INT,NR INT,MONEY DECIMAL(11, 2));

INSERT INTO @Client (ID)
VALUES (1),(2),(3);

INSERT INTO @Banks (ID,NR,MONEY)
SELECT ROW_NUMBER() OVER (ORDER BY id) AS ID,id AS NR,0 AS MONEY
FROM @Client;
SELECT *
FROM @Banks;

引用自:https://dba.stackexchange.com/questions/173410