繁体   English   中英

在表中插入唯一数据

[英]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_IDJob_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM