SQL обновление с несколькими объединениями - PullRequest
0 голосов
/ 17 февраля 2020

При переносе существующей базы данных из 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

Как видно из рисунка, он знает, что компонент тип - конденсатор, а тип детали - РАЗНОЕ. Однако 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];

1 Ответ

0 голосов
/ 17 февраля 2020

Я вижу, что JOIN выглядят неправильно. Например, у вас есть:

CDB2020.dbo.ComponentType ct join
CDB2020.dbo.PartType pt
on pt.Name = a.[Part Type]

Из того, что я могу сказать, это должно быть:

CDB2020.dbo.ComponentType ct join
CDB2020.dbo.PartType pt
on pt.ComponentType_ID = ct.ComponentType_ID

Я не могу сказать, есть ли у вас другие проблемы такого рода.

...