2012-05-15 39 views
-1

我有一个SQL Server表中包含通过keyfield链接到ledgercode表的分类帐代码的列。目前列显示keyfield值,而不是我用这个查询来创建新表的代码号:SQL查询数据联接具有空值,它忽略

SELECT [OC_Key] 
    ,[OC_PO_PO_DPNo] 
    ,[OC_DateofInv] 
    ,[V_VendorNo] 
    ,[OC_ExpDescrip] 
    ,[LedgerCode] 
    ,[OC_InvoiceNo] 
    ,[OC_DatePosted] 
    ,[OC_TotAmount] 
    ,[OC_Type] 
    ,[OC_Initials] 
INTO dbo.OCommittedTbl 
FROM [CommittedTbl] CT, [codeLedgerTbl] LT, [VendorTbl] VT 
WHERE VT.V_VenKey = CT.OC_VendorName and LT.LedgerKey = CT.OC_LedgerCode 

我的问题,我有一些在表中的行具有为ledgercode列空值,这个新表格仅将484行中的34个拉入表格中。

如何绕过空值以便它们仍然会被拉入我的表中?

+1

你不应该编写隐式连接,它们是一个sql反模式,它在20年前被更好的显式连接取代。 – HLGEM

回答

3

使用LEFT JOIN而不是(隐式)INNER JOIN。

SELECT ... 
INTO dbo.OCommittedTbl 
FROM [CommittedTbl] CT 
LEFT JOIN [codeLedgerTbl] LT ON LT.LedgerKey = CT.OC_LedgerCode 
LEFT JOIN [VendorTbl] VT ON VT.V_VenKey = CT.OC_VendorName 
+0

感谢它的工作! – developthestars

1

的INNER JOIN不包括空项,尝试用左连接

SELECT [OC_Key] 
    ,[OC_PO_PO_DPNo] 
    ,[OC_DateofInv] 
    ,[V_VendorNo] 
    ,[OC_ExpDescrip] 
    ,[LedgerCode] 
    ,[OC_InvoiceNo] 
    ,[OC_DatePosted] 
    ,[OC_TotAmount] 
    ,[OC_Type] 
    ,[OC_Initials] 
INTO dbo.OCommittedTbl 
FROM [CommittedTbl] CT 
LEFT JOIN [codeLedgerTbl] LT ON LT.LedgerKey = CT.OC_LedgerCode 
LEFT JOIN [VendorTbl] VT ON VT.V_VenKey = CT.OC_VendorName 
WHERE VT.V_VenKey = CT.OC_VendorName and LT.LedgerKey = CT.OC_LedgerCode 
3

首先,你需要学习的JOIN语法。第二,回答你的问题是左外连接:

SELECT [OC_Key], [OC_PO_PO_DPNo], [OC_DateofInv], [V_VendorNo], [OC_ExpDescrip], 
     [LedgerCode], [OC_InvoiceNo], [OC_DatePosted], [OC_TotAmount], [OC_Type], [OC_Initials] 
INTO dbo.OCommittedTbl 
FROM [CommittedTbl] CT left outer join 
    [codeLedgerTbl] LT 
    on LT.LedgerKey = CT.OC_LedgerCode left outer join 
    [VendorTbl] VT 
     on VT.V_VenKey = CT.OC_VendorName 

第三,我在主键和具有相同名称的外键的忠实粉丝。因此,如果您构建了原始表,那么您可以使用一致的命名约定。