2010-11-30 27 views
2

首先我會解釋我的情況。下面是使用2個總表:SQL讓我頭痛 - 多個連接

帳戶:

LegacyID =的 帳戶

InvoiceAccount的IDENTIFER =一個帳戶可以在同一 表 多個子賬戶。此字段是其父賬戶

客戶的LegacyID =可以有兩種不同的 類型的賬戶,他們可以共享 ID的 - 所以此列的2區分 對於我 SQL我的目的總是希望它是真實的而不是假的

AllocatedUser = 需要看到這個 交付的人的用戶名。這只是填充在 父帳戶,所以我需要鏈接 回去拿本作的子賬戶

交付:

LegacyID =的交付標識符

客戶=的LegacyID的賬戶 (可以是 子賬戶)

OnHold =一個標誌爲pu rposes我查詢的 必須

現在,這解釋,基本上我需要它返回的「ONHOLD」任何交付的SQL,但只適用於運送該分配登錄的用戶帳戶「真」。如果交付鏈接到父帳戶,則選擇AllocatedUser的查詢很簡單,但如果交付鏈接到子帳戶,則返回行時出現問題 - 它根本不會返回任何內容。這裏是下面的SQL:

SELECT  Deliveries_1.LegacyID, Deliveries_1.TripDate, Deliveries_1.OnHoldReason, Account_2.AllocatedUser 
FROM   Deliveries AS Deliveries_1 INNER JOIN 
         Account AS Account_1 ON Deliveries_1.Customer = Account_1.InvoiceAccount INNER JOIN 
         Account AS Account_2 ON Account_1.InvoiceAccount = Account_2.LegacyID 
WHERE  (Deliveries_1.OnHold = @OnHold) AND (Account_2.Customer = 'True') AND (Account_2.AllocatedUser = @AllocatedUser) 

我的心從試圖找出爲什麼它不會在此刻疲憊不堪的工作 - 我真的很感激任何意見。

謝謝!

+0

你可以提供一些數據,例如,與預期的結果? – Fede 2010-11-30 17:15:38

+0

我們還需要類型,特別是Deliveries.Customer,Account.InvoiceAccount,Account.LegacyID,Account.Customer,Deliveries.OnHold,Account.AllocatedUser,@OnHold和@AllocatedUser – 2010-11-30 17:19:51

回答

2

聽起來好像您正在查找Deliveries表中與用戶帳戶,用戶的直接父母帳戶和用戶的直接子帳戶關聯的記錄。如果這是真的修改你的查詢如下應該做的伎倆。

SELECT DISTINCT d.LegacyID, d.TripDate, d.OnHoldReason, 
     case 
      when child.LegacyID = d.Customer then child.AllocatedUser 
      when parent.LegacyID = d.Customer then parent.AllocatedUser 
      else this.AllocatedUser 
     end as 'Delivery_AllocatedUser' 
FROM Account this 
    LEFT JOIN Account parent on parent.LegacyID = this.InvoiceAccount 
    LEFT JOIN Account child on this.LegacyID = child.InvoiceAccount 
    JOIN Deliveries d on (d.Customer = this.LegacyID AND this.Customer = 'True') 
        OR (d.Customer = parent.LegacyID AND parent.Customer = 'True') 
        OR (d.Customer = child.LegacyID AND child.Customer = 'True') 
WHERE d.OnHold = @OnHold 
    AND this.AllocatedUser = @AllocatedUser 
0

第一條評論是,如果您遇到問題,您應該逐步建立連接。

第二個評論是,在你發佈的查詢中有沒有不必要的聯接 - 你不是過濾,也不選擇也不加入任何特定於表的別名,如Account_1

也許這是你做錯了什麼的跡象。否則,查詢看起來(!)正常(假設所有連接都是正確的;你的描述不是確切的 - 例如對於Accounts.Customer,你說'爲了我的SQL的目的,我總是希望它是真實的而不是錯誤的' - 客戶不是真實/虛假的,是什麼意思?還有其他這樣的不一致......)

一些樣本數據和一個結果樣本可能會更清楚一些。

0
ON Deliveries_1.Customer = Account_1.InvoiceAccount 
ON Account_1.InvoiceAccount = Account_2.LegacyID 

如果這兩個條件都爲真,那麼Delivery.Customer將等於Account2.LegacyId(輸送將必須是在父帳戶)。我不認爲這就是你的意圖。

也許你的意思是

ON Deliveries_1.Customer = Account_1.LegacyID 
ON Account_1.InvoiceAccount = Account_2.LegacyID