Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите составить запрос

9.1K
15 декабря 2004 года
sith666
2 / / 15.12.2004
Хочется заполнить таблицу покупателей. Но не ручками, а посредством скрипта.
Допустим есть таблица(все эти строчки сгенерированы ErWin-ом, поэтому ошибок в
синтаксисе нет):

CREATE TABLE CUSTOMER (
id_cust int NOT NULL,
cust_name char(50) NULL,
cust_surname char(50) NULL
)

ALTER TABLE CUSTOMER
ADD PRIMARY KEY NONCLUSTERED (id_cust)

Таблица совершенно пустая. Ещё есть 3 вспомогательные таблицы, из которых я
хочу забить данные в CUSTOMER: tblid_cust(clid_cust),tblCustName(clCustName),
tblCustSurname(clCustSurname). Допустим в tblid_cust хранятся 4 записи: 1, 2,
3, 4; в tblCustName 2 записи: Витя, Михаил; в tblCustSurname 2 записи: Иванов,
Петров.
Задача: используя эти 3 "справочные" таблицы получить в CUSTOMER 4 записи:
1 Витя Иванов
2 Витя Петров
3 Михаил Иванов
4 Миаил Петров

Разумеется, что количество записей гораздо больше четырёх, посему ручками не
хочется. Пытаюсь делать так(спецтермин: декартово произведение):

INSERT INTO dbo.CUSTOMER(id_cust,cust_name,cust_surname)
SELECT dbo.tblid_cust.clid_cust,dbo.tblCustName.clCustName,dbo.tblCustSurName.clCustSurName
FROM dbo.tblid_cust,dbo.tblCustName,dbo.tblCustSurname

В ответ на что получаю ругань(MS Query Analyzer):
Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__CUSTOMER__76CBA758'. Cannot insert duplicate key in object 'CUSTOMER'.
The statement has been terminated.

Ну естественно! SQL осуществляет декартово произведение и первичного ключа тоже!
Как заполнить табличку? Может быть это можно сделать другим способом?
302
16 декабря 2004 года
Sagittarius
648 / / 12.04.2003
Цитата:
Originally posted by sith666
В ответ на что получаю ругань(MS Query Analyzer):
Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__CUSTOMER__76CBA758'. Cannot insert duplicate key in object 'CUSTOMER'.
The statement has been terminated.

Ну естественно! SQL осуществляет декартово произведение и первичного ключа тоже!
Как заполнить табличку? Может быть это можно сделать другим способом?


Зачем ты пытаешься вставить первичный ключ в таблицу? Первичный ключ заполняет сам сервер.

259
16 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sith666
Хочется заполнить таблицу покупателей. Но не ручками, а посредством скрипта.
Допустим есть таблица(все эти строчки сгенерированы ErWin-ом, поэтому ошибок в
синтаксисе нет):

CREATE TABLE CUSTOMER (
id_cust int NOT NULL,
cust_name char(50) NULL,
cust_surname char(50) NULL
)

ALTER TABLE CUSTOMER
ADD PRIMARY KEY NONCLUSTERED (id_cust)

Таблица совершенно пустая. Ещё есть 3 вспомогательные таблицы, из которых я
хочу забить данные в CUSTOMER: tblid_cust(clid_cust),tblCustName(clCustName),
tblCustSurname(clCustSurname). Допустим в tblid_cust хранятся 4 записи: 1, 2,
3, 4; в tblCustName 2 записи: Витя, Михаил; в tblCustSurname 2 записи: Иванов,
Петров.
Задача: используя эти 3 "справочные" таблицы получить в CUSTOMER 4 записи:
1 Витя Иванов
2 Витя Петров
3 Михаил Иванов
4 Миаил Петров

Разумеется, что количество записей гораздо больше четырёх, посему ручками не
хочется. Пытаюсь делать так(спецтермин: декартово произведение):

INSERT INTO dbo.CUSTOMER(id_cust,cust_name,cust_surname)
SELECT dbo.tblid_cust.clid_cust,dbo.tblCustName.clCustName,dbo.tblCustSurName.clCustSurName
FROM dbo.tblid_cust,dbo.tblCustName,dbo.tblCustSurname

В ответ на что получаю ругань(MS Query Analyzer):
Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__CUSTOMER__76CBA758'. Cannot insert duplicate key in object 'CUSTOMER'.
The statement has been terminated.

Ну естественно! SQL осуществляет декартово произведение и первичного ключа тоже!
Как заполнить табличку? Может быть это можно сделать другим способом?


У тебя SELECT шарашит все записи в четырех экзах. Попробуй использовать inner join dbo.tblCustName where dbo.tblid_cust.clid_cust = dbo.tblCustName.clid_cust. Что-то в этом роде.

ЗЫ: Конечно clid_cust придется ввести. В твоем примере у тебя не третья нормальная форма поэтому и ключ не уникален. Вобщем думаю ты понял, что идея состоит в четком сопоставлении ключа (ид) и записей таблиц. Напомню что sql хорошо работает только с 3 нормальной формой.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог