Избегайте вставки дубликатов при работе с составным первичным ключом - PullRequest
0 голосов
/ 15 января 2020

Я пишу запрос в SQL, который передает данные из базы данных Acces в новую базу данных управления сервером SQL. Эта передача является единовременной, поэтому мне не нужно беспокоиться о том, что код является супер обобщенным c.

Я пытаюсь вставить данные из нескольких таблиц (включая таблицы из базы данных Acces), но получаю сообщение об ошибке дубликатов в составном первичном ключе.

Моя проблема в том, что я не могу понять, почему мое использование отличных не предотвращает эти дубликаты.

Таблица, в которую я хочу вставить, построена так:

ComponentSupplier table

Код, который я пытаюсь выполнить, написан следующим образом:

-- Insert into ComponentSupplier for [Supplier 1]

insert into CDB2020.dbo.ComponentSupplier
(
    Supplier_ID,
    BK_ID,
    Part_ID,
    Datasheet,
    LF,
    Preferred
)
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 1 order no], a.[PDF Data 1 sheet link], a.[Supplier 1 LF], '1'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 1]

-- Insert into ComponentSupplier for [Supplier 2]

insert into CDB2020.dbo.ComponentSupplier
(
    Supplier_ID,
    BK_ID,
    Part_ID,
    Datasheet,
    LF,
    Preferred
)
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 2 order no], a.[PDF Data 2 sheet link], a.[Supplier 2 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 2]

-- Insert into ComponentSupplier for [Supplier 3]

insert into CDB2020.dbo.ComponentSupplier
(
    Supplier_ID,
    BK_ID,
    Part_ID,
    Datasheet,
    LF,
    Preferred
)
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 3 order no], a.[PDF Data 3 sheet link], a.[Supplier 3 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 3]

-- Insert into ComponentSupplier for [Supplier 4]

insert into CDB2020.dbo.ComponentSupplier
(
    Supplier_ID,
    BK_ID,
    Part_ID,
    Datasheet,
    LF,
    Preferred
)
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 4 order no], a.[PDF Data 4 sheet link], a.[Supplier 4 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 4]

-- Insert into ComponentSupplier for [Supplier 5]

insert into CDB2020.dbo.ComponentSupplier
(
    Supplier_ID,
    BK_ID,
    Part_ID,
    Datasheet,
    LF,
    Preferred
)
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 5 order no], a.[PDF Data 5 sheet link], a.[Supplier 5 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 5]

-- Insert into ComponentSupplier for [Supplier 6]

insert into CDB2020.dbo.ComponentSupplier
(
    Supplier_ID,
    BK_ID,
    Part_ID,
    Datasheet,
    LF,
    Preferred
)
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 6 order no], a.[PDF Data 6 sheet link], a.[Supplier 6 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 6]

1 Ответ

0 голосов
/ 15 января 2020

Дедубликаты distinct на основе всех столбцов в select.

Проблема может заключаться в том, что вы вставляете запись, используя несколько insert..selects, вы можете попробуйте что-то вроде этого, чтобы убедиться, что записи правильно дублированы.

distinct будет дублировать каждый select, а union будет выполнять дедупликацию между операторами select:

insert into CDB2020.dbo.ComponentSupplier
(
    Supplier_ID,
    BK_ID,
    Part_ID,
    Datasheet,
    LF,
    Preferred
)
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 1 order no], a.[PDF Data 1 sheet link], a.[Supplier 1 LF], '1'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 1]
union
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 2 order no], a.[PDF Data 2 sheet link], a.[Supplier 2 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 2]
union
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 3 order no], a.[PDF Data 3 sheet link], a.[Supplier 3 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 3]
union
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 4 order no], a.[PDF Data 4 sheet link], a.[Supplier 4 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 4]
union
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 5 order no], a.[PDF Data 5 sheet link], a.[Supplier 5 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 5]
union
select distinct s.Supplier_ID, c.BK_ID, a.[Supplier 6 order no], a.[PDF Data 6 sheet link], a.[Supplier 6 LF], '0'
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 6]

Вы можете использовать такой запрос, чтобы найти дубликаты записей (group by все поля в вашем составном ключе):

select s.Supplier_ID, c.BK_ID, count(*)
from  AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no]
inner join CDB2020.dbo.Suppliers as s on s.Name = a.[Supplier 6]
group by s.Supplier_ID, c.BK_ID 
having count(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...