2016-05-05 5 views
0

Я пытаюсь вставить в ассоциативную таблицу на Visual Studio 2013, но я также считаю, что я мог бы создать структуру для таблиц, настроенных неправильно. Мне нужно, чтобы ассоциативная таблица использовала первичные ключи таблиц «Задачи» и «Студент».Вставить в ассоциативную таблицу

Ожидаемый результат:

StudentID TaskID  Status 
----------- ----------- ------ 
1   1   N 
1   2   N 
1   3   N 
1   4   N 
1   5   N 
1   6   N 
1   7   N 
2   1   N 
2   2   N 
2   3   N 
2   4   N 
2   5   N 
2   6   N 
2   7   N 

Любая помощь будет принята с благодарностью!


CREATE TABLE [dbo].[STUDENT] (
[StudentID] INT   IDENTITY (1, 1) NOT NULL, 
... 
PRIMARY KEY CLUSTERED ([StudentID] ASC)); 


CREATE TABLE [dbo].[TASKS] (
[TaskID]  INT   NOT NULL, 
[TaskName]  NVARCHAR (MAX) NULL, 
[TaskCategory] NVARCHAR (MAX) NULL, 
PRIMARY KEY CLUSTERED ([TaskID] ASC)); 


CREATE TABLE [dbo].[ASSOCIATIVE] (
[StudentID] INT  NOT NULL, 
[TaskID] INT  NOT NULL, 
[Status] NCHAR (10) NULL, 
PRIMARY KEY CLUSTERED ([TaskID] ASC, [StudentID] ASC), 
CONSTRAINT [FK_ASSOCIATIVE_STUDENT] FOREIGN KEY ([StudentID]) REFERENCES [dbo].[STUDENT] ([StudentID]), 
CONSTRAINT [FK_ASSOCIATIVE_TASKS] FOREIGN KEY ([TaskID]) REFERENCES [dbo].[TASKS] ([TaskID])); 

ответ

0

То, что вы хотите это CROSS JOIN:

INSERT INTO ASSOCIATIVE(StudentID, TaskID, Status) 
SELECT 
    s.StudentID, t.TaskID, 'N' 
FROM STUDENT s 
CROSS JOIN TASKS t 

Если вы хотите запустить это снова, и вы хотите, чтобы избежать нарушения PK, добавить NOT EXISTS условие:

WHERE NOT EXISTS(
    SELECT 1 
    FROM ASSOCIATIVE a 
    WHERE 
     a.TaskID = t.TaskID 
     AND a.StudentID = s.StudentID 
) 
+0

Спасибо огромное! Если бы я хотел добавить данные в таблицу STUDENT, когда ученик добавлен и запускает этот запрос, есть ли операция, такая как VALUES @StudentId? Это было бы главным образом для того, чтобы избежать нарушения основных ключей. – sang3r

+0

@ sang3r, см. Мой обновленный ответ. –

Смежные вопросы