Есть ли другое решение для моего вопроса? - PullRequest
0 голосов
/ 03 апреля 2019

для данного входа мне нужно получить желаемый выход

Вход

table1                                   
+----------------------+
id      |    coursename   
+-----------------------+      
1            SQL
2            Artificial Intelligence
3            Machine Learning

table2

+---------------------------+
id       |    teachername
+----------------------------+
1             shreya
1             ramya
2             darshan
2             ravi

table3

+----------------------------+
id        |   studentname
+-----------------------------+
1               raj
1              mani
1              chandru
2              prem

Выход

+------------------------------------------------------------------------+
id        | coursename            |    teachername  | studentname
+-------------------------------------------------------------------------+
1            SQL                        shreya         raj
1            SQL                        ramya          mani
1            SQL                        null           chandru
2          artificial intelligence       darshan       prem
2          artificial intelligence        ravi          null
3          machine learning               null         null

Я получил решение одним способом

SELECT c.id,
       c.coursename,
       t.teachername,
       s.studentname
FROM  (SELECT id,
              teachername,
              row_number()
                OVER(
                  partition BY id
                  ORDER BY id) AS teach
       FROM   table2)AS t
      FULL JOIN(SELECT id,
                       studentname,
                       row_number()
                         OVER(
                           partition BY id
                           ORDER BY id) AS stud
                FROM   table3) AS s
             ON( t.teach = s.stud
                 AND t.id = s.id )
      RIGHT JOIN (SELECT id,
                         coursename
                  FROM   table1) AS c
              ON( c.id = s.id
                   OR c.id = t.id ) 

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

вам нужно иметь идентификатор учителя в таблице учеников и идентификатор учителя в таблице преподавателей:

DECLARE @course TABLE
(
    Id int,
    CourseName varchar(100)
)

DECLARE @teacher TABLE
(
    CId int,
    TId int,
    TeacherName varchar(100)
)

DECLARE @student TABLE
(
    Id int,
    TId int,
    StudentName varchar(100)
)

INSERT INTO @course VALUES(1,'SQL')
INSERT INTO @course VALUES(2,'AI')
INSERT INTO @course VALUES(3,'ML')

INSERT INTO @teacher VALUES(1, 1,'shreya')
INSERT INTO @teacher VALUES(1, 2, 'ramya')
INSERT INTO @teacher VALUES(2, 3, 'darshan')
INSERT INTO @teacher VALUES(2, 4, 'ravi')

INSERT INTO @student VALUES(1,1,'raj')
INSERT INTO @student VALUES(1,1,'mani')
INSERT INTO @student VALUES(1,2,'chandra')
INSERT INTO @student VALUES(2,3,'prem')


SELECT c.Id, c.CourseName, t.TeacherName, s.StudentName 
FROM @course c  
    LEFT JOIN @teacher t ON c.Id = t.CId 
    LEFT JOIN @student s ON c.Id = s.Id AND t.TId = s.TId

Вывод:

enter image description here

0 голосов
/ 03 апреля 2019

Вы хотите LEFT JOIN с FULL OUTER JOIN:

WITH cte AS (
     SELECT t1.id, t1.coursename, t2.teachername,
            ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY(SELECT 1)) AS RN
     FROM table1 t1 LEFT JOIN
          table2 t2
          ON t2.id = t1.id

), cte1 AS (
     SELECT t1.id, t1.coursename, t3.studentname,
            ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY(SELECT 1)) AS RN
     FROM table1 t1 LEFT JOIN
          table3 t3
          ON t3.id = t1.id
)

SELECT ISNULL(c.id, c1.id) AS id, ISNULL(c.coursename, c1.coursename) AS coursename, c.teachername, c1.studentname
FROM cte c full outer join
     cte1 c1 
     ON c1.id = c.id and c1.RN = c.RN;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...