在SQL Server中显示NULL值加入

问题描述:

我正在使用SQL Server。我有3个表:在SQL Server中显示NULL值加入

  1. tblUser
  2. tblAudit
  3. tblEnum

的tblAudit得到了4列:

nUserId,的NID:这两列指向tblUser

vFromValue,vToValue:这两列指向tblEnum

现在,我需要根据tblAudit表中存在的ID显示来自tblUser和tblEnum的实际值。 我写的查询看起来是这样的:

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) 

因为在审核表中的值是零对于一些行的列vFromValue和vToValue,这些值都不会再为NULL,但以前的值。 如何通过更改上述查询来完整显示空值?请帮忙。

由于tblAudit.vFromValuetblAudit.vToValueNULL S,试试这个:

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

伟人!帮助完善我的解决方案。解决。 –

如果我理解你的问题 - 尝试对最后两行使用LEFT JOIN(并在OR之后删除条件)。

+0

做了吧:)没有帮助。然而,已经尝试了其他方法来解决问题,但我认为它不是一个干净的解决方案,而是为了达到目的。发布它作为答案。如果有人遇到更好的解决方案,请将其发布。谢谢。 –