Включение строк без значений в вывод SQL-запроса - PullRequest
0 голосов
/ 17 мая 2018

Выполнение следующего запроса в моей базе данных SQL SERVER 2016:

SELECT
    u.idnumber,
    gi.idnumber AS code,
    gg.finalgrade AS grade
FROM
    grades AS gg 
INNER JOIN grade_items AS gi ON gg.itemid = gi.id 
INNER JOIN users AS u ON gg.userid = u.id
WHERE gi.idnumber IN ('436','434','313','002','135')
AND (u.idnumber = 'JohnBrown-xyz123);

дает мне такой результат:

-------------------------
idnumber    code    grade
-------------------------
John12558   313     96
John12558   135     83

Как включить строку для ВСЕХ 5 gi.idnumber, включая строки без оценки?

-------------------------
idnumber    code    grade
-------------------------
John12558   436
John12558   434
John12558   313     96
John12558   002
John12558   135     83

Таблицы базы данных:

Пользователь

id PK

grade_items

id PK

grade_grades

grade_grades.itemid FK (grade_items)

grade_grades.userid FK (пользователь)

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

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

select tt.idnumber, 
       t.idnumber AS code, 
       tt.grade 
from (values ('436'), ('434'), ('313'), ('002'), ('135')) t (idnumber) 
left join (select
                 u.idnumber,
                 gi.idnumber AS code,
                 gg.finalgrade AS grade
           from grades AS gg 
           inner join grade_items AS gi ON gg.itemid = gi.id 
           inner join users AS u ON gg.userid = u.id
           where u.idnumber = 'JohnBrown-xyz123') tt on left(tt.code, 3) = t.idnumber

Если idnumber имеет числовой тип, тогда вам не нужно использовать ' '.

0 голосов
/ 17 мая 2018

Вам нужно cross join, чтобы увидеть все, что вы хотите:

select 
    u.idnumber,
    gi.idnumber code,
    ISNULL(gg.finalgrade, 0) grade
from  users u
    cross join grade_items gi
    left outer join grades gg on gg.itemid = gi.id  and gg.userid = u.id
where gi.idnumber in ('436','434','313','002','135')
    and u.idnumber = 'JohnBrown-xyz123'

нули в finalgrade нельзя заменить на 'N / A', потому что это числа, а не строки, я заменил их на ноль.

0 голосов
/ 17 мая 2018

Предполагая, что "no value" равно NULL, просто добавьте дополнительное предложение к вашему WHERE:

WHERE (LEFT(gi.idnumber, 3) IN ('436','434','313','002','135')
   OR gi.idnumber IS NULL)

Edit: Apaprently, вышеупомянутое не работает, что подразумевает, что "no value"не означает NULL.вместо этого вы можете попробовать:

    WHERE (LEFT(gi.idnumber, 3) IN ('436','434','313','002','135','')

Если это не сработает, предоставьте расходуемые образцы данных, с которыми мы можем проверить: Этикет форума: какопубликовать данные для вопроса T-SQL

...