SQL Server: левое соединение - проверьте, что значение столбца правой таблицы равно нулю - PullRequest
0 голосов
/ 04 декабря 2018

У меня следующий запрос:

select --this select should always give me 1 record
    tbl1.Id, tbl1.Name, tbl1.Address, tbl2.relNo, 
    CASE WHEN tbl3.Comments IS NOT NULL THEN 1 ELSE 0 END AS 'Required'
from 
    table1 tbl1 
inner join 
    table2 tbl2 on tbl2.Id = tbl1.Id
left join -- This left join table gives me 5 records for one instance
    (select 
         R.Id, C.Comments
     from
         tblC C
     inner join 
         tblR R on R.Id = C.id) tbl3 on tbl3.Id = tbl2.Id

Я хочу написать оператор CASE в строках, которые мое левое соединение дает для проверки на нулевое значение, как указано выше, и мой окончательный запрос выбора всегда возвращает только 1строка.Есть ли способ проверить, проверяются ли все пять значений столбца комментариев из моего левого соединения на NULL в приведенном выше запросе?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Это то, что вы ищете?

(СЛУЧАЙ КОГДА (выберите количество (tbl3.id) ОТ tbl3 ГДЕ tbl3.Comments IS NULL) затем 1 или 0 конец) как 'RequiredVal'

select --this select should always give me 1 record
     tbl1.Id, tbl1.Name, tbl1.Address, tbl2.relNo, 
     CASE WHEN tbl3.Comments IS NOT NULL THEN 1 ELSE 0 END AS 'Required'

     , (CASE WHEN (select count(tbl3.id) FROM tbl3 WHERE tbl3.Comments IS NULL) then 1 else 0 end) as 'RequiredVal'

From table1 tbl1 
inner join table2 tbl2 on tbl2.Id = tbl1.Id
left join (-- This left join table gives me 5 records for one instance
      SELECT R.Id,
             C.Comments
      FROM tblC C
      INNER JOIN tblR R on R.Id = C.id
 ) tbl3 on tbl3.Id = tbl2.Id
0 голосов
/ 04 декабря 2018

Я бы воспользовался сокращением использования COUNT () OVER PARTITION

CASE WHEN COUNT(*) OVER (PARTITION BY tbl3.Id)  =0 THEN 0 ELSE 1 END AS 'Required'

Вам бы пришлось DISTINCT ваш вывод выше.Другим вариантом будет GROUP BY и фильтрация в предложении HAVING.

select --this select should always give me 1 record
     tbl1.Id, tbl1.Name, tbl1.Address, tbl2.relNo
From table1 tbl1 
inner join table2 tbl2 on tbl2.Id = tbl1.Id
left join (-- This left join table gives me 5 records for one instance
      SELECT R.Id,
             C.Comments
      FROM tblC C
      INNER JOIN tblR R on R.Id = C.id
 ) tbl3 on tbl3.Id = tbl2.Id     
 GROUP BY 
    Id, Name, Address, relNo
 HAVING 
    COUNT(*) = 5
...