MySQL запрос, чтобы проверить, что отсутствует связь между многими - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть три таблицы MySQL, как показано ниже:

 CREATE TABLE  students (
  StudentName VARCHAR(255),   
  StudentID VARCHAR(255) 
  );

 CREATE TABLE  courses (
  CourseName VARCHAR(255),   
  CourseID VARCHAR(255) 
  );

CREATE TABLE  participation (
 CourseID VARCHAR(255),   
 StudentID VARCHAR(255) 
 );

INSERT INTO students
 VALUES ('Biplab',  '04CS9501'),
       ('Amit',  '05CS3001'),
       ('Rahul',  '05CS3003'),
       ('Divya',  '05CS3004'),
       ('Praveen',  '05CS3005');


INSERT INTO courses
 VALUES ('Business and Science',  'B3D'),
        ('Economics',  'B3B'),
        ('Business and Laws',  '63O1'),
        ('Economics and Laws',  '63K1'),
        ('Economics and Science',  'B3E');

  INSERT INTO participation 
    VALUES ('B3D',  '04CS9501'),
    ('B3D',  '05CS300'),
    ('B3D',  '05CS3003'),
    ('B3B',  '05CS3003'),
    ('B3B',  '05CS3004'),
    ('63O1',  '04CS9501'),
    ('63O1',  '05CS3004'),
    ('63K1',  '05CS3001'),
    ('63K1',  '05CS3003'),
    ('63K1',  '05CS3004');

Работая в предположении, что каждый студент должен пройти курс, и каждый курс должен иметь участие студента, я хотел бы проверить целостность данных, имея возможность определить курсы, в которых нет студентов или студентов, которые не имеют участие в курсе. В данном случае студент "Правин" и курса "Экономика и наука".

Как будет построен такой запрос?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Вы можете использовать следующее решение, чтобы получить все курсы без participation:

-- to get all empty courses using "WHERE NOT ... IN ..."
SELECT * 
FROM courses 
WHERE NOT CourseID IN (SELECT CourseID FROM participation)

-- or using "LEFT JOIN"
SELECT c.*
FROM courses c LEFT JOIN participation p ON c.CourseID = p.CourseID
WHERE p.StudentID IS NULL

... и следующее решение для получения студентов без participation:

-- to get all students wihtout participation using "WHERE NOT ... IN ..."
SELECT * 
FROM students 
WHERE NOT StudentID IN (SELECT StudentID FROM participation)

-- or using "LEFT JOIN"
SELECT s.*
FROM students s LEFT JOIN participation p ON s.StudentID = p.StudentID 
WHERE p.CourseID IS NULL

Вы также можете использовать LEFT JOIN для получения ожидаемых записей. Кроме того, вы можете использовать UNION ALL и дополнительный столбец для получения всех записей одним запросом:

SELECT 'Student' AS type, s.StudentID AS 'ID', s.StudentName AS 'Name' 
FROM students s LEFT JOIN participation p ON s.StudentID = p.StudentID 
WHERE p.CourseID IS NULL

UNION ALL

SELECT 'Course' AS type, c.CourseID, c.CourseName 
FROM courses c LEFT JOIN participation p ON c.CourseID = p.CourseID
WHERE p.StudentID IS NULL

ORDER BY type, Name

демо на dbfiddle.uk

1 голос
/ 26 апреля 2019

Вы можете использовать коррелированный подзапрос с NOT EXISTS для проверки студентов без записи в таблице participation.

SELECT *
       FROM students s
       WHERE NOT EXISTS (SELECT *
                                FROM participation p
                                WHERE p.studentid = s.studentid);

И аналогично для курсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...