При переносе существующей базы данных из Access в SQL я пытаюсь обновить таблицу в SQL с именем Component, но она принимает дубликаты. Написанный мной запрос выглядит следующим образом:
update CDB2020.dbo.Components
set PartType_ID = pt.PartType_ID
from CDB2020.dbo.PartType as pt
inner join AccessDataMigration_1.dbo.[B-K Data] as a on pt.Name = a.[Part Type]
inner join CDB2020.dbo.ComponentType as ct on ct.Name = a.[Component Type]
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no];
Используемые таблицы создаются следующим образом:
CREATE TABLE [dbo].[Components](
[BK_ID] [nchar](255) NOT NULL,
[Value] [nchar](255) NULL,
[Description] [nchar](255) NULL,
[PartType_ID] [int] NULL,
CONSTRAINT [PK_Components] PRIMARY KEY CLUSTERED
(
GO
ALTER TABLE [dbo].[Components] WITH CHECK ADD CONSTRAINT [FK_ComponentsPartType] FOREIGN KEY([PartType_ID])
REFERENCES [dbo].[PartType] ([PartType_ID])
Таблица уже содержит BK_ID
, Value
и Description
данные. Теперь мне нужно вставить PartType_ID
.
Таблица PartType
создается следующим образом:
CREATE TABLE [dbo].[PartType](
[PartType_ID] [int] IDENTITY(0,1) NOT NULL,
[Name] [nchar](50) NOT NULL,
[ComponentType_ID] [int] NOT NULL,
CONSTRAINT [PK_PartType] PRIMARY KEY CLUSTERED
ALTER TABLE [dbo].[PartType] WITH CHECK ADD CONSTRAINT [FK_PartTypeComponentType] FOREIGN KEY([ComponentType_ID])
REFERENCES [dbo].[ComponentType] ([ComponentType_ID])
GO
ALTER TABLE [dbo].[PartType] CHECK CONSTRAINT [FK_PartTypeComponentType]
Что относится к:
CREATE TABLE [dbo].[ComponentType](
[ComponentType_ID] [int] IDENTITY(0,1) NOT NULL,
[Name] [nchar](50) NOT NULL,
CONSTRAINT [PK_ComponentType] PRIMARY KEY CLUSTERED
Таблица [BK Data] в БД AccessDataMigration_1 является таблица, содержащая информацию о допустимых комбинациях идентификатора компонента, типа и типа компонента:
CREATE TABLE [dbo].[B-K Data](
[B-K no] [nvarchar](255) NULL,
[Value] [nvarchar](255) NULL,
[Text] [nvarchar](255) NULL,
[Component Type] [nvarchar](50) NULL,
[Part Type] [nvarchar](255) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Проблема в том, что когда я использовал запрос на обновление, он создает дубликаты. Здесь я использовал следующий запрос выбора для демонстрации проблемы:
Select comp.BK_ID, pt.PartType_ID, pt.Name as PartType, ct.Name as ComponentType
from (((AccessDataMigration_1.dbo.[B-K Data] as a
inner join CDB2020.dbo.Components as comp on comp.BK_ID = a.[B-K no])
inner join CDB2020.dbo.ComponentType as ct on ct.Name = a.[Component Type])
inner join CDB2020.dbo.PartType as pt on pt.Name = a.[Part Type])
where BK_ID = 'CK0820'
![Select query result](https://i.stack.imgur.com/HssGa.png)
Как видно из рисунка, он знает, что компонент тип - конденсатор, а тип детали - РАЗНОЕ. Однако PartType_ID имеет 7 (!) Разных экземпляров, потому что он нашел 7 разных экземпляров, в которых тип компонента был MISCELLANEOUS.
Я хочу, чтобы моя таблица содержала только ОДИН экземпляр с правильным PartType_ID. Что я делаю неправильно в своем запросе на обновление?
Я пытался изменить запрос на обновление на следующий, но с теми же результатами.
CDB2020.dbo.Components
set PartType_ID = pt.PartType_ID
from CDB2020.dbo.PartType as pt
inner join AccessDataMigration_1.dbo.[B-K Data] as a on pt.Name = a.[Part Type]
inner join CDB2020.dbo.ComponentType as ct on ct.ComponentType_ID = pt.ComponentType_ID
inner join CDB2020.dbo.Components as c on c.BK_ID = a.[B-K no];