2012-12-18 33 views
0

我有一个SQL查询:MS SQL条件加入

SELECT * FROM Customer c 
    LEFT JOIN Invoice I ON I.InvcNum = C.Cust_InvcNum 

一些事情改变和连接不起作用,因为没有在数据中的“Cust_InvcNum”没有一致性。所以现在,当它没有找到连接的记录或者它是空的,它需要检查另一个条件。

LEFT JOIN Invoice I ON I.InvcNum = (SELECT p.InvcPrefix FROM Prefix WHERE p.DealerID = I.DealrID) + '-' + I.InvcNum 

第二次加入我做的工作,但它需要太长的时间才能得到我的数据。有没有其他的方式来做到这一点。

此前它曾经是

加入上I.InvcNum = C.Cust_InvcNum
都列有像DlrCd-InvcNum即相同的数据均列1234-A789 但不是可以匹配的上述数据还是现在在发票表 可以填充像Dlrd-InvcNum或InvcPrefix-InvcNum列“InvcNum”

所以InvcNum = 1234-A789但CustNum = I94-A789 所以我们需要检查是否进行InvoicePrefix -InvcNum

+1

您可以发布一些您试图加入的示例数据吗?理解你想要做的事情可能会更容易。 – Taryn

+0

这可能可以通过在连接的ON中使用'OR Cust_InvcNum IS NULL AND othercondition'来完成,但是我们需要查看一些数据。 –

+0

你看过执行计划,看看性能问题在哪里吗? – HABO

回答

0
SELECT * 
FROM Customer c 
    LEFT JOIN (
      SELECT i.InvcNum, p.InvcPrefix + '-' + I.InvcNum AS pInvcNum 
      FROM Invoice i LEFT JOIN Prefix p ON i.DealrID = p.DealrID 
      ) ip ON c.Cust_InvcNum = CASE WHEN c.Cust_InvcNum = ip.InvcNum 
              THEN ip.InvcNum 
              ELSE ip.pInvcNum END