Пожалуйста, помогите мне решить эту инструкцию SQL. Я провел несколько дней с этой проблемой.
Я использую SQL Server 2012.
Уровень = 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 строк.
Как с этим решить?
Кажется, вы пытаетесь использовать EXISTS
как IN
, но затем ваш EXISTS
возвращает 3 столбца и не имеет бокового соединения? Также пришло время присоединиться к остальным и перестать использовать синтаксис, который устарел уже 27 лет: Плохие привычки, от которых нужно избавляться: использование JOIN в старом стиле
Я хочу, чтобы НЕ СУЩЕСТВУЕТ в подзапросе. Я пробовал NOT IN, но ошибка возникает с EXISTS
Пожалуйста, помогите мне, я провожу много дней только с этим делом.
Два запроса должны коррелировать?
SID — это одно и то же значение, а другие значения независимы.
JOIN
в стандарте SQL ANSI-92 (более 25 лет назад), и его использование не рекомендуется.
Независимые значения, которые я поместил в «...», отмечены
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
из внешнего запроса. Возможно, вам будет полезно поискать коррелированный подзапрос для лучшего понимания концепции.
Это хорошо сделано. @shawnt00, миллиард благодарностей, я сделал это с тобой, моя память.
Я также сделал со стилем соединения, приведенным выше комментарием @Larnu. Миллиард спасибо всем.
Табличные данные и ожидаемые результаты помогут вашему посту.