[英]Insertion of data after creating index on empty table or creating unique index after inserting data on oracle?
[英]Inserting Unique Data into Table
我目前正在使用SQL Server升级数据库。 目前,我正在尝试清理表以消除一大堆重复的记录。 但是我似乎无法使我的查询正常工作。
CREATE TABLE Temp_A
(
Order_ID INT NOT NULL,
Job_Number VARCHAR(20) NOT NULL,
Supplier_Name VARCHAR(50) NOT NULL
);
BULK INSERT Temp_A
FROM 'This\is\the\file\path.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
CREATE TABLE Temp_B
(
Order_ID INT NOT NULL,
Job_Number VARCHAR(20) NOT NULL,
Supplier_Name VARCHAR(50) NOT NULL
CONSTRAINT Temp_Con UNIQUE (Order_ID, Job_Number)
);
INSERT INTO Temp_B
SELECT Order_ID, Job_Number, Supplier_Name
FROM Temp_A AS A
WHERE NOT EXISTS (SELECT 1
FROM Temp_B AS B
WHERE B.Order_ID = A.Order_ID
AND B.Job_Number = A.Job_Number)
我的代码中不起作用的部分是最后的INSERT INTO Temp_B
块。 我正在做的是将数据从CSV文件插入到Temp_A
表中,然后尝试获取所有唯一的Order_ID & Part_Number
对,并将它们存储在Temp_B
表中。
我很乐意手动删除这些重复项,但是有成千上万的记录,所以……是永久的。 我不确定从这里去哪里。
编辑:要添加错误消息,我得到:
违反UNIQUE KEY约束'Temp_Con'。 无法在对象'dbo.Temp_B'中插入重复的密钥。 重复的键值为(3,L154)
您具有2列的唯一性,但源数据却具有3列。如果您有多于1个具有相同Order_ID
和Job_Number
行,那么您将选择哪一行?
通过MAX()
使用GROUP BY
。
INSERT INTO Temp_B (
Order_ID,
Job_Number,
Supplier_Name
SELECT
Order_ID,
Job_Number,
Supplier_Name = MAX(Supplier_Name)
FROM
Temp_A AS A
WHERE
NOT EXISTS (
SELECT
'not yet in Temp_B'
FROM
Temp_B AS B
WHERE
B.Order_ID = A.Order_ID AND
B.Job_Number = A.Job_Number)
GROUP BY
A.Order_ID,
A.Job_Number
使用ROW_NUMBER()
。
;WITH MissingRanked AS
(
SELECT
Order_ID,
Job_Number,
Supplier_Name,
Ranking = ROW_NUMBER() OVER (
PARTITION BY
A.Order_ID,
Job_Number
ORDER BY
(SELECT NULL)) -- Your ordering criteria here
FROM
Temp_A AS A
WHERE
NOT EXISTS (
SELECT
'not yet in Temp_B'
FROM
Temp_B AS B
WHERE
B.Order_ID = A.Order_ID AND
B.Job_Number = A.Job_Number)
)
INSERT INTO Temp_B (
Order_ID,
Job_Number,
Supplier_Name
SELECT
Order_ID,
Job_Number,
Supplier_Name
FROM
MissingRanked AS M
WHERE
M.Ranking = 1
我会尝试通过GROUP使我的INSERT INTO唯一,而不是这样:
INSERT INTO Temp_B
SELECT Order_ID, Job_Number, Supplier_Name
FROM Temp_A AS A
GROUP BY A.Order_ID, A.Job_Number, A.Supplier_Name
我没有要测试的数据,但我认为这可以工作。 您的问题具有Order_ID & Part_Number
但编写的Order_ID & Part_Number
没有,我猜是type-o,但您知道了。 这是我要遵循的方向。 您也可以使用DISTINCT
但我喜欢GROUP BY
您的方法不起作用,因为子选择将看到与插入之前相同的记录-即它看到一个空表。
您需要的是DISTINCT关键字。
INSERT INTO Temp_B
SELECT DISTINCT Order_ID, Job_Number, Supplier_Name
FROM Temp_A
您可以在INSERT查询中添加DISTINCT关键字:
INSERT INTO Temp_B
SELECT DISTINCT Order_ID, Job_Number, Supplier_Name
FROM Temp_A AS A
WHERE NOT EXISTS (
SELECT 1 FROM Temp_B AS B
WHERE B.Order_ID = A.Order_ID
AND B.Job_Number = A.Job_Number);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.