Как решить этот запрос? - PullRequest
0 голосов
/ 28 мая 2019

Пожалуйста, помогите мне решить эту инструкцию SQL.Я провел несколько дней с этой проблемой.

Я использую SQL Server 2012.

Level = N'First '- я использую текст Unicode

SELECT ss.id,
       ss.SID,
       CONCAT(CONCAT(ss.Name, ' '), ss.Surname) AS Sname,
       ss.Level,
       pp.PID,
       CONCAT(CONCAT(pp.Name1, ' '), pp.Name2) AS Pname,
       ss.Chk
FROM tb_student1 AS ss,
     tb_parent AS pp
WHERE ss.ParentID = pp.PID
  AND ss.Level = N'First'
  AND ss.Chk = 1
  AND NOT EXISTS (SELECT st.SID
                         FROM (SELECT s.id,
                                      s.SID,
                                      CONCAT(CONCAT(s.Name, ' '), s.Surname) AS Sname,
                                      p.PID,
                                      CONCAT(CONCAT(p.Name1, ' '), p.Name2) AS Pname,
                                      s.Chk
                               FROM tb_student1 AS s,
                                    tb_parent AS p
                               WHERE s.ParentID = p.PID
                                 AND s.Level = N'First'
                                 AND s.Chk = 1) AS st ,
                              (SELECT * FROM tb_New_Reg AS r) AS rnp
                         WHERE st.SID = rnp.SID
                           AND rnp.ClassID = 'C104'
                           AND rnp.Year = '2018-2019'
                           AND rnp.Term = 'Jan'
                           AND rnp.Level = N'First'
                           AND st.Chk = 1);

Если я использую(... и ss.SID не существует ...) ошибка здесь.Если я использую (... а не существует ....) возвращаемое значение null

Первый запрос содержит 11 строк, подзапрос содержит 6 строк

Как решить с ним?

1 Ответ

2 голосов
/ 28 мая 2019
WITH data AS (
    SELECT
        ss.id, ss.SID,
        CONCAT(CONCAT(ss.Name, ' '), ss.Surname) AS Sname,
        ss.Level, pp.PID,
        CONCAT(CONCAT(pp.Name1, ' '), pp.Name2) AS Pname,
        ss.Chk
    FROM tb_student1 AS ss INNER JOIN tb_parent AS pp ON ss.ParentID = pp.PID
    WHERE ss.Level = N'First' AND ss.Chk = 1
)
SELECT * FROM data AS s
WHERE NOT EXISTS (
    SELECT * FROM tb_New_Reg AS rnp
    WHERE s.SID = rnp.SID
        AND rnp.ClassID = 'C104'
        AND rnp.Year = '2018-2019'
        AND rnp.Term = 'Jan'
        AND rnp.Level = N'First'
);

Я думаю, что это соответствует тому, что вы ищете.Я разбил ваш основной запрос на CTE, думая, что я дублирую этот же запрос внутри подзапроса.Оказывается, это, вероятно, не было действительно необходимо, но я оставил это таким образом.

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

...