簡體   English   中英

帶選擇的SQL插入語句

[英]SQL insert statement with select

我有以下SQL語句

INSERT INTO A_Table (field1, field2) 
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table);

基本上,我需要將所有數據從B_Table復制到A_Table,並限制:A_Table中不存在來自B_Table的field1。 我需要添加此約束,因為field1是關鍵。

看起來像是沖突:不在A_Table中的field1從B_Table復制到A_Table。 在插入過程中,從B_Table復制的記錄將存在於A_Table中。 不知道它是否有效,還是有任何意外結果?

也許還可以。 最后一個SELECT緩存在臨時表中,並且在插入過程中沒有刷新?

順便說一下,我的SQL Server是Microsoft SQL Server 2005。

如果您在兩個單獨的語句中查看查詢,可能會有所幫助

選擇語句

  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table)

這給你一些結果

現在將這些結果插入表A_table

INSERT INTO A_Table (field1, field2)

而實現此目的的代碼是

INSERT INTO A_Table (field1, field2)
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table)

基本上就是您發布的內容

SQL語句的執行就像一切都立即發生一樣。 (從邏輯上來講)部分執行指令是沒有時間的。

SELECT的結果集是在插入之前確定的,因此不會發生沖突。 否則,這樣的陳述將永遠是不安全的。 有點像代碼:

x = 1;
x = x + x + 1;

評估右手邊,然后才將其賦給左手邊的變量-否則誰知道x的結局!

您的插入語句將按此SQL所示工作-

CREATE TABLE #temp1 (id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED , [name] NVARCHAR(20))
CREATE TABLE #temp2 (id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED , [name] NVARCHAR(20))

INSERT INTO #temp1 ([name])
VALUES ('name1')
INSERT INTO #temp1 ([name])
VALUES ('name2')
INSERT INTO #temp1 ([name])
VALUES ('name3')
INSERT INTO #temp1 ([name])
VALUES ('name4')
INSERT INTO #temp2 ([name])
VALUES ('Othername1')
INSERT INTO #temp2 ([name])
VALUES ('Othername2')

INSERT INTO #temp2 (name)
SELECT name FROM #temp1
WHERE id NOT IN (SELECT id FROM #temp2)

SELECT * FROM #temp1
SELECT * FROM #temp2

DROP TABLE #temp1
DROP TABLE #temp2

結果是

臨時1

身份證名

1個名稱1
2名稱2
3名稱3
4個名字4

臨時2

身份證名

1其他名稱1
2其他名稱2
3名稱3
4個名字4

好吧,該查詢似乎無法以其當前形式運行,因為您沒有在子查詢中指定列。 它很可能仍在執行,並且假設您的意思not in (null)

它應該工作正常。

您應該始終設置一個測試環境,在這里可以嘗試一些東西以查看會發生什么。 在弄亂數據庫之前,您永遠不想依靠陌生人的建議!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM