Добавление строк в таблицу на основе других табличных данных

#sql #sql-server

#sql #sql-сервер

Вопрос:

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

Для моего экземпляра у меня 5 учеников. Каждый учащийся изучает 3 предмета (математику, английский и естественные науки). У каждого предмета есть 3 теста. Это означает, что все 5 студентов сдают в общей сложности 9 тестов каждый по 3 предметам.

Я создал таблицу Student, таблицу Subject и таблицу Test. Сейчас я пытаюсь создать таблицу Student_Results, в которой мне нужно иметь все 9 тестов для всех 5 студентов в одной таблице, которая будет отображать их заданный результат для их тестов.

Я изо всех сил пытался понять это правильно.

Смотрите таблицы, которые я создал ниже.

 CREATE TABLE DBO.STUDENTS
(
STUDENT_ID VARCHAR(15) PRIMARY KEY,
STUDENT_FIRSTNAME VARCHAR(255) NOT NULL,
STUDENT_SURNAME VARCHAR(255) NOT NULL,
STUDENT_SCORE_AVERAGE VARCHAR(30)
);

-- Creating the 'Subjects' Table 
CREATE TABLE DBO.SUBJECTS
(
SUBJECT_ID VARCHAR(12) PRIMARY KEY,
SUBJECT_NAME VARCHAR(30) NOT NULL,
SUBJECT_AVERAGE VARCHAR(30)
);

-- Creating the 'Tests' Table 
CREATE TABLE DBO.TESTS
(
TEST_ID VARCHAR(12) PRIMARY KEY,
TEST_NAME VARCHAR(30) NOT NULL,
TEST_DESCRIPTION VARCHAR(50),
TEST_AVERAGE VARCHAR(3)
);

-- Creating the 'Student_Score' Table 
CREATE TABLE DBO.STUDENT_SCORES
(
RESULT_ID VARCHAR (12) PRIMARY KEY,
STUDENT_ID VARCHAR(12) ,
TEST_ID VARCHAR(12),
STUDENT_SCORE VARCHAR(30)
);

create table #TempStudent
    ( 
    STUDENT_KEY INT identity (10000000,1),
    STUDENT_ID  AS CONCAT('STD',STUDENT_KEY),
    STUDENT_FIRSTNAME VARCHAR(255), 
    STUDENT_SURNAME VARCHAR(255)
    )

INSERT INTO #TempStudent
VALUES  ( 'Daenerys' , 'Targaryen' ),
        ( 'Jon' , 'Snow' ),
        ( 'Gregor' , 'Clegane' ),
        ( 'Arya' , 'Stark' ),
        ( 'Cersei' , 'Lannister' )

INSERT INTO STUDENTS (STUDENT_ID, STUDENT_FIRSTNAME , STUDENT_SURNAME)
SELECT STUDENT_ID, STUDENT_FIRSTNAME, STUDENT_SURNAME
FROM #TempStudent

create table #TempSubject
    ( 
    SUBJECT_KEY INT identity (10000000,1),
    SUBJECT_ID  AS CONCAT('SUB',SUBJECT_KEY),
    SUBJECT_NAME VARCHAR(255)
    )

INSERT INTO #TempSubject
VALUES ('Maths'),
       ('Science'),
       ('English')

INSERT INTO SUBJECTS (SUBJECT_ID, SUBJECT_NAME )
SELECT SUBJECT_ID, SUBJECT_NAME
FROM #TempSubject

create table #TempTest
    ( 
    TEST_KEY INT identity (100,1),
    TEST_ID  AS CONCAT('TST',TEST_KEY),
    TEST_NAME VARCHAR(255),
    TEST_DESCRIPTION VARCHAR(255)
    )

INSERT INTO #TempTest
VALUES ('Maths 1', 'Geometry'),
       ('Maths 2', 'Algebra'),
       ('Maths 3', 'Fractions'),
       ('Science 1', 'Astronomy'),
       ('Science 2', 'Biology'),
       ('Science 3', 'Chemistry'),
       ('English 1', 'Grammer'),
       ('English 2', 'Spelling'),
       ('English 3', 'Literature')

INSERT INTO TESTS(TEST_ID, TEST_NAME , TEST_DESCRIPTION )
SELECT TEST_ID, TEST_NAME, TEST_DESCRIPTION
FROM #TempTest

create table #TempScoreSubmission
    ( 
    SCORE_KEY INT identity (1234,1),
    RESULT_ID  AS CONCAT('RES',SCORE_KEY)
    )
 

Ответ №1:

Я не знаю, куда вы хотите пойти со всеми этими временными таблицами, и почему бы вам просто не создать фактические таблицы с первичным ключом в качестве идентификатора и напрямую вставить в них… Но чтобы получить все пары идентификаторов учащихся и идентификаторов тестов, вы можете использовать перекрестное соединение. Я полагаю, что это то, что вы ищете.

 SELECT s.student_id,
       t.test_id
       FROM dbo.students s
            CROSS JOIN dbo.tests t;