Отображение значений NULL в соединениях SQL Server - PullRequest
0 голосов
/ 07 октября 2011

Я использую SQL Server.У меня есть 3 таблицы:

  1. tblUser
  2. tblAudit
  3. tblEnum

В tblAudit есть 4 столбца:

nUserId, nID: эти два столбца указывают на tblUser

vFromValue, vToValue: эти два столбца указывают на tblEnum

Теперь мне нужно показать фактические значения из tblUser и tblEnumна основе идентификаторов, присутствующих в таблице tblAudit.Написанный мною запрос выглядит примерно так:

SELECT A.aEventID,
U.tName AS MakerChecker,
U2.tName AS OnUser,
VLE.tDisplayName AS FromValue,
VLE2.tDisplayName AS ToValue,
A.dChangeTime AS Timestamp
FROM tblAudit A INNER JOIN tblUser U ON A.nUserId = U.aUserId
INNER JOIN tblUser U2 ON A.nID = U2.aUserId
INNER JOIN tblEnum VLE ON A.vFromValue = VLE.nIndex OR (A.vFromValue IS NULL)
INNER JOIN tblEnum VLE2 ON  A.vToValue = VLE2.nIndex OR (A.vToValue IS NULL)

Поскольку значения в таблице Audit для столбцов vFromValue и vToValue для некоторых строк равны нулю, эти значения будут иметь значение NULL, а не предыдущее.,Как я могу отобразить нулевые значения без изменений, изменив вышеуказанный запрос?Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 07 октября 2011

Поскольку tblAudit.vFromValue и tblAudit.vToValue имеют NULL с, попробуйте это:

SELECT A.aEventID,
       U.tName AS MakerChecker,
       U2.tName AS OnUser,
       VLE.tDisplayName AS FromValue,
       VLE2.tDisplayName AS ToValue,
       A.dChangeTime AS Timestamp
FROM 
     ( SELECT aEventID, nUserId, nID, dChangeTime  
            , COALESCE(vFromValue, -9999) AS vFromValue   --- some non-existent
            , COALESCE(vToValue, -999) AS vToValue        --- value
       FROM tblAudit
     ) AS A 
  INNER JOIN tblUser U
    ON A.nUserId = U.aUserId
  INNER JOIN tblUser U2 
    ON A.nID = U2.aUserId
  LEFT JOIN tblEnum VLE 
    ON A.vFromValue = VLE.nIndex
  LEFT JOIN tblEnum VLE2 
    ON  A.vToValue = VLE2.nIndex

или это:

SELECT A.aEventID,
       U.tName AS MakerChecker,
       U2.tName AS OnUser,
       ( SELECT VLE.tDisplayName
         FROM tblEnum VLE 
         WHERE A.vFromValue = VLE.nIndex
       ) AS FromValue,
       ( SELECT VLE2.tDisplayName
         FROM tblEnum VLE2 
         WHERE A.vToValue = VLE.nIndex
       ) AS ToValue,
       A.dChangeTime AS Timestamp
FROM tblAudit AS A 
  INNER JOIN tblUser U
    ON A.nUserId = U.aUserId
  INNER JOIN tblUser U2 
    ON A.nID = U2.aUserId
0 голосов
/ 07 октября 2011

Если я понимаю ваш вопрос - попробуйте использовать LEFT JOIN для двух последних строк (и удалите условия после ИЛИ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...