Member 14156756 Ответов: 1

Можно ли оптимизировать и другие запросы этого запроса?


У нас есть три стола. Нам нужно получить результат в соответствии с тем, что я заявляю после вопроса.


CREATE TABLE College
(
    CollegeId INT IDENTITY(1, 1)
   ,CollegeName VARCHAR(20)
   ,CONSTRAINT PK_College_CollegeId
        PRIMARY KEY (CollegeId)
)

CREATE TABLE Faculty
(
    CollegeId INT
   ,FacultyName VARCHAR(20)
   ,CONSTRAINT FK_College_Faculty_CollegeId
        FOREIGN KEY (CollegeId)
        REFERENCES College (CollegeId)
)

CREATE TABLE Student
(
    CollegeId INT
   ,StudentName VARCHAR(20)
   ,CONSTRAINT FK_College_Student_CollegeId
        FOREIGN KEY (CollegeId)
        REFERENCES College (CollegeId)
)

INSERT INTO College
VALUES
('A')
,('B')
,('C')

INSERT INTO Faculty
VALUES
(1, 'aaa')
,(1, 'bbb')
,(2, 'ccc')
,(2, 'ddd')

INSERT INTO Student
VALUES
(1, 'xxx')
,(1, 'yyy')
,(1, 'zzz')
,(2, 'www')

SELECT * FROM College
SELECT * FROM Faculty
SELECT * FROM Student


Из положить будет :-

<pre>CollegeId
CollegeName FacultyName StudentName
1 A aaa xxx
1 A bbb yyy
1 A NULL zzz
2 B ccc www
2 B ddd NULL
3 C NULL NULL


Что я уже пробовал:

SELECT COALESCE(cf.CollegeId,cs.CollegeId) AS CollegeId,
	   COALESCE(cf.CollegeName,cs.CollegeName) AS CollegeName,
	   cf.FacultyName,
	   cs.StudentName
FROM
	(SELECT c.CollegeId,
			c.CollegeName,
			f.FacultyName,
			ROW_NUMBER () OVER (PARTITION BY f.CollegeId ORDER BY f.CollegeId) AS row_num
	FROM College c FULL JOIN 
		 Faculty f ON c.CollegeId = f.CollegeId)cf FULL JOIN 
	(SELECT c.CollegeId,
			c.CollegeName,
			s.StudentName, 
			ROW_NUMBER () OVER (PARTITION BY s.CollegeId ORDER BY s.CollegeId) AS row_num
	FROM College c FULL JOIN 
		 Student s ON c.CollegeId = s.CollegeId)cs ON cf.row_num = cs.row_num AND 
													  cf.CollegeId = cs.CollegeId 
ORDER BY COALESCE(cf.CollegeId,cs.CollegeId)

Andy Lanng

Что это за данные? каков ваш вывод из текущего запроса? в чем же проблема?

Member 14156756

у нас есть этот третий стол. Колледж, факультет и студент.
Нам нужно получить этот результат, используя три таблицы.

Andy Lanng

да - я пропустил данные - теперь я это вижу
Какой результат вы получаете от запроса в разделе "Что я пробовал"?

1 Ответов

Рейтинг:
2

CHill60

Вы не можете получить эти результаты из этих таблиц. Ваш дизайн неправильный - единственное, что соединяет объекты, - это CollegeId таким образом, у вас нет способа узнать, на каком факультете находится каждый студент.

Вместо CollegeId в студенческом столе, факультет был бы лучше. Хотя имейте в виду, что это означало бы, что каждый студент может принадлежать только к одному факультету

Кроме того, не объединяйте таблицы таким образом - это очень старомодно и подвержено ошибкам. Видеть Объединение таблиц в SQL[^] для правильного пути.

Так что вы должны закончить с чем-то вроде этого...

select c.CollegeId as CollegeId,
	   t.FacultyName   as FacultyName,
       c.CollegeName as CollegeName,
       s.StudentName   as StudentName
from student s
     INNER JOIN Faculty t ON s.FacultyId = t.FacultyId
     INNER JOIN College c ON c.CollegeId = t.CollegeId
order by c.CollegeId


Andy Lanng

Почти уверен, что это то же самое задание, которое я вижу в это время каждый год. Я не думаю, что изменение структуры-это то, что они могут сделать
Соединения неверны,но так же и данные,если это ожидаемый результат [2,B, ddd, null] не будет иметь null.

CHill60

Вы должны удивляться некоторым из этих учебных заведений. Это не самый худший пример, который я видел, но он определенно там!

Andy Lanng

XD

Member 14156756

не могли бы вы мне помочь, например?

CHill60

Что вы подразумеваете под оптимизацией? Приклейте несколько индексов на таблицы.

Member 14156756

можем ли мы получить тот же результат, не используя функцию row_number, COALESCE или ISSNULL()???

Andy Lanng

Где здесь используется row_number? Ты перестал иметь смысл. Обычно именно в этот момент мы просим вас поговорить с вашим наставником, потому что, по-видимому, существует некоторое недопонимание основного принципа

CHill60

OP использовал row_number как надуманный способ объединения некоторых ужасных запросов вместе. Учитывая то, как они изначально соединяли таблицы, я подозреваю, что они были сколочены вместе, копируя вещи из других мест. Это не тот запрос, который они первоначально опубликовали.

Member 14156756

можем ли мы оптимизировать запрос, который я пытаюсь выполнить?

Andy Lanng

Нет, без соединений вы не можете получить нулевые значения

Member 14156756

без row_NUMBER???