Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запись данных из одной таблицы в несколько связанных таблиц  [new]
IvanVetrov
Member

Откуда: Брянск
Сообщений: 51
Здравствуйте!

Прошу помощи.

Как правильно заполнить связанные таблицы в БД из одной таблицы?

Пример:
Есть исходная таблица с данными [dbo].[Table_all] с тремя столбцами
[field_A] [nvarchar](50) NULL,
[field_B] [nvarchar](50) NULL,
[field_C] [nvarchar](50) NULL

Нужно данные из этой таблицы распределить в 3 таблицы:

table_A, table_B, table_C

table_B связана с table_A 1 ко многим
table_C связана с table_B 1 ко многим



+
USE [master]
GO
/****** Object:  Database [testrela]    Script Date: 08.11.2016 16:35:16 ******/
CREATE DATABASE [testrela]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'testrela', FILENAME = N'D:\Data\testrela.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'testrela_log', FILENAME = N'D:\Data\testrela_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [testrela] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [testrela].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [testrela] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [testrela] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [testrela] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [testrela] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [testrela] SET ARITHABORT OFF 
GO
ALTER DATABASE [testrela] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [testrela] SET AUTO_CREATE_STATISTICS ON 
GO
ALTER DATABASE [testrela] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [testrela] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [testrela] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [testrela] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [testrela] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [testrela] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [testrela] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [testrela] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [testrela] SET  DISABLE_BROKER 
GO
ALTER DATABASE [testrela] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [testrela] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [testrela] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [testrela] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [testrela] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [testrela] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [testrela] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [testrela] SET RECOVERY FULL 
GO
ALTER DATABASE [testrela] SET  MULTI_USER 
GO
ALTER DATABASE [testrela] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [testrela] SET DB_CHAINING OFF 
GO
ALTER DATABASE [testrela] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [testrela] SET TARGET_RECOVERY_TIME = 0 SECONDS 
GO
USE [testrela]
GO
/****** Object:  Table [dbo].[table_A]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table_A](
	[id_table_A] [int] IDENTITY(1,1) NOT NULL,
	[field_A] [nchar](10) NULL,
 CONSTRAINT [PK_table_A] PRIMARY KEY CLUSTERED 
(
	[id_table_A] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[Table_all]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table_all](
	[field_A] [nvarchar](50) NULL,
	[field_B] [nvarchar](50) NULL,
	[field_C] [nvarchar](50) NULL
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[table_B]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table_B](
	[id_table_B] [int] IDENTITY(1,1) NOT NULL,
	[field_B] [nchar](10) NULL,
	[link_table_A] [int] NOT NULL,
 CONSTRAINT [PK_table_B] PRIMARY KEY CLUSTERED 
(
	[id_table_B] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[table_C]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table_C](
	[id_table_C] [int] IDENTITY(1,1) NOT NULL,
	[field_C] [nchar](10) NULL,
	[link_table_B] [int] NOT NULL,
 CONSTRAINT [PK_table_C] PRIMARY KEY CLUSTERED 
(
	[id_table_C] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
INSERT [dbo].[Table_all] ([field_A], [field_B], [field_C]) VALUES (N'okr1', N'ray1', N'kv1')
INSERT [dbo].[Table_all] ([field_A], [field_B], [field_C]) VALUES (N'okr1', N'ray2', N'kv1')
INSERT [dbo].[Table_all] ([field_A], [field_B], [field_C]) VALUES (N'okr2', N'ray1', N'kv1')
/****** Object:  Index [IX_table_C]    Script Date: 08.11.2016 16:35:16 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_table_C] ON [dbo].[table_C]
(
	[id_table_C] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[table_B]  WITH CHECK ADD  CONSTRAINT [FK_table_B_table_A] FOREIGN KEY([link_table_A])
REFERENCES [dbo].[table_A] ([id_table_A])
GO
ALTER TABLE [dbo].[table_B] CHECK CONSTRAINT [FK_table_B_table_A]
GO
ALTER TABLE [dbo].[table_C]  WITH CHECK ADD  CONSTRAINT [FK_table_C_table_B] FOREIGN KEY([link_table_B])
REFERENCES [dbo].[table_B] ([id_table_B])
GO
ALTER TABLE [dbo].[table_C] CHECK CONSTRAINT [FK_table_C_table_B]
GO
USE [master]
GO
ALTER DATABASE [testrela] SET  READ_WRITE 
GO


Сообщение было отредактировано: 8 ноя 16, 17:29
8 ноя 16, 17:06    [19871331]     Ответить | Цитировать Сообщить модератору
 Re: Запись данных из одной таблицы в несколько связанных таблиц  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
IvanVetrov,

1. DISTINCT fieldA INTO TableA FROM TableALL
2. DISTINCT fieldAid, fieldB INTO TableB FROM TableALL JOIN TableA ON fieldA
3. ...
8 ноя 16, 17:28    [19871482]     Ответить | Цитировать Сообщить модератору
 Re: Запись данных из одной таблицы в несколько связанных таблиц  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Нумеруете строки общей таблицы, затем используете вставку с output, получаете таблицу связей между номерами и идентификаторами таблицы В. Используете это для вставки в таблицу С ( а(id)+output=ID(b) ).
Как-то так.

Если напрямую output из разных таблиц не удастся собрать, то можно попробовать merge(b) вместо insert(b).
8 ноя 16, 18:01    [19871695]     Ответить | Цитировать Сообщить модератору
 Re: Запись данных из одной таблицы в несколько связанных таблиц  [new]
IvanVetrov
Member

Откуда: Брянск
Сообщений: 51
Руслан Дамирович,
я не понял такой приём. DISTINCT?
16 ноя 16, 11:21    [19899200]     Ответить | Цитировать Сообщить модератору
 Re: Запись данных из одной таблицы в несколько связанных таблиц  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
IvanVetrov,

Вы же хотите выкинуть повторяющиеся строки из А и С и оставить связь между ними в Б.
16 ноя 16, 11:39    [19899287]     Ответить | Цитировать Сообщить модератору
 Re: Запись данных из одной таблицы в несколько связанных таблиц  [new]
IvanVetrov
Member

Откуда: Брянск
Сообщений: 51
Владислав,
да, так и есть. Причём нужно вставлять в эти таблицы только в том случае, этих записей там нет.

Не могли бы сбросить готовый запрос на основе той тестовой бд, что я отправил?
16 ноя 16, 16:03    [19900625]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить