Помогите составить запрос
Допустим есть таблица(все эти строчки сгенерированы 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 осуществляет декартово произведение и первичного ключа тоже!
Как заполнить табличку? Может быть это можно сделать другим способом?
Цитата:
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 осуществляет декартово произведение и первичного ключа тоже!
Как заполнить табличку? Может быть это можно сделать другим способом?
В ответ на что получаю ругань(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 осуществляет декартово произведение и первичного ключа тоже!
Как заполнить табличку? Может быть это можно сделать другим способом?
Зачем ты пытаешься вставить первичный ключ в таблицу? Первичный ключ заполняет сам сервер.
Цитата:
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 осуществляет декартово произведение и первичного ключа тоже!
Как заполнить табличку? Может быть это можно сделать другим способом?
Хочется заполнить таблицу покупателей. Но не ручками, а посредством скрипта.
Допустим есть таблица(все эти строчки сгенерированы 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 нормальной формой.