Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server联接中显示空值_Sql Server_Tsql_Join - Fatal编程技术网

Sql server 在SQL Server联接中显示空值

Sql server 在SQL Server联接中显示空值,sql-server,tsql,join,Sql Server,Tsql,Join,我正在使用SQL Server。我有三张桌子: 特布卢瑟 特布拉迪特 特伯伦 tblAudit有4列: nUserId,nID:这两列指向tblUser vFromValue,vToValue:这两列指向tblEnum 现在,我需要根据tbludit表中的id显示tblUser和tblEnum的实际值。 我编写的查询如下所示: SELECT A.aEventID, U.tName AS MakerChecker, U2.tName AS OnUser, VLE.tDisplayName AS F

我正在使用SQL Server。我有三张桌子:

  • 特布卢瑟
  • 特布拉迪特
  • 特伯伦
  • tblAudit有4列:

    nUserId,nID:这两列指向tblUser

    vFromValue,vToValue:这两列指向tblEnum

    现在,我需要根据tbludit表中的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,因此这些值不是null,而是前一个值。
    如何通过更改上述查询完整地显示空值?请帮助。

    如果我理解您的问题,请尝试对最后两行使用左连接(并删除或之后的条件)。

    由于
    tblAudit.vFromValue
    tblAudit.vToValue
    具有
    NULL
    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
    
    已经做了:)没有帮助。然而,我尝试了其他解决问题的办法,但我认为这不是一个干净的解决办法,而是达到了目的。将其作为答案发布。如果有人找到更好的解决方案,请发布。谢谢