2013-08-20 93 views
0

我有不同的表/視圖我是從拉:InvoiceDetailcontactpartyaddressremarks連接兩個表沒有合併列

基本上,我需要從remarks表,並涉及其與party表是訪問remarks表的其餘部分引用其id列這是對party表的外鍵的唯一途徑獲取數據。

id也是在Invoice視圖中的列,因此FROM條款執行時,它結合了對Invoice端ID字段並沒有什麼留下來涉及到的其他remarks列。同樣在任何一個表中的列名不能被改變:

SELECT * 
FROM Invoice as invoice_view LEFT OUTER JOIN 
    Detail as details ON invoice_view.transact = details.transact LEFT OUTER JOIN 
    contact AS co_contact ON invoice_view.company = co_contact.party LEFT OUTER JOIN 
    contact AS cp_contact ON invoice_view.company = cp_contact.party INNER JOIN 
    party as main_party ON invoice_view.party = main_party.party INNER JOIN 
    party as pay_party ON invoice_view.pay = pay_party.party INNER JOIN 
    party as rec_party ON invoice_view.rec = rec_party.party LEFT OUTER JOIN 

    contact as rec_contact ON rec_party.party = rec_contact.party INNER JOIN 
    address as rec_address ON rec_contact.party = rec_address.party AND rec_contact.address = rec_address.addresscode LEFT OUTER JOIN 
    contact AS pay_contact ON pay_party.party = pay_contact.party INNER JOIN 
    adddress AS pay_address ON pay_contact.party = pay_address.party AND pay_contact.address = pay_address.addresscode AND pay_party.party = pay_address.party LEFT OUTER JOIN 
--What I tried to get it working 
    remark as cp_remark CROSS JOIN 
party as custom_party 

WHERE 
    ( (custom_party.party = pay_party.party) AND (custom_party.id = cp_remark.id)    OR (cp_remark.id IS NULL) OR (custom_party.remark = 0)) 
--More where statements that have no affect on this 
+0

因此,一切工作,因爲它應該注意到評論加入? – JsonStatham

+0

什麼問題? –

+1

如果您更改select *以僅選擇所需的字段,則模糊字段名稱的問題應該消失。 –

回答

3

你需要一個ON條件添加到您的remark加入,擺脫CROSS JOIN的。例如,你可以這樣做:

LEFT OUTER JOIN remark as cp_remark ON cp_remark.id = main_party.id OR cp_remark.id = pey_party.id OR cp_remark.id = rec_party.id  

在一個側面說明,有幾個建議:

  • ,除非你正在寫你自己的消費查詢不要使用SELECT *。您的代碼應該顯示您正在使用的數據,只將其包含在結果集中。
  • 這是個人喜好,但我總是發現把你的連接放在左邊比把它放在右邊容易得多。
  • 以更合乎邏輯的方式訂購您的JOIN,您的第二個JOIN需要您的第七個數據,嘗試添加細節。
  • 您正在加入太多表格,您不需要加入任何具有外鍵的所有內容,只需要提供您爲這個精確查詢所提供的數據。
  • 您的最終加入是一個完整的加入(否ON),然後是CROSS JOIN(這些是等同的),在大多數情況下這兩種都不是好主意。這兩個都會導致將表格的完整結果添加到結果集中。
  • 外鍵用作指導和數據完整性,它們沒有定義連接實際執行的方式。
  • 同樣命名的列可以通過使用table.column來解決,您已經在爲您的連接進行操作。

這是我將如何格式化您的原始版本。(因爲我不知道什麼確切的變化將是最適合你的數據集,我不包括我對這裏推薦)

SELECT * 
FROM Invoice as invoice_view 
LEFT OUTER JOIN Detail as details ON invoice_view.transact = details.transact 
INNER JOIN party as main_party ON invoice_view.party = main_party.party 
LEFT OUTER JOIN contact AS co_contact ON invoice_view.company = co_contact.party 
LEFT OUTER JOIN contact AS cp_contact ON invoice_view.company = cp_contact.party 

INNER JOIN party as rec_party ON invoice_view.rec = rec_party.party 
LEFT OUTER JOIN contact as rec_contact ON rec_party.party = rec_contact.party 
INNER JOIN address as rec_address ON rec_contact.party = rec_address.party 
           AND rec_contact.address = rec_address.addresscode 

INNER JOIN party as pay_party ON invoice_view.pay = pay_party.party 
LEFT OUTER JOIN contact AS pay_contact ON pay_party.party = pay_contact.party 
INNER JOIN adddress AS pay_address ON pay_contact.party = pay_address.party 
            AND pay_contact.address = pay_address.addresscode 
            AND pay_party.party = pay_address.party 
--What I tried to get it working        
LEFT OUTER JOIN remark as cp_remark 
CROSS JOIN party as custom_party 
WHERE 
((custom_party.party = pay_party.party) 
    AND (custom_party.id = cp_remark.id) 
    OR (cp_remark.id IS NULL) 
    OR (custom_party.remark = 0)) 
--More where statements that have no affect on this 

編輯:

既然你問什麼做的加入:

  • 加入/內加入 - 只需要具有數據在兩個表中
  • 左連接/左外連接行 - 只需要具有在左邊的表(未列出的一個)的數據行,從取數據如果有的話
  • 右加入/左外連接 - 的左連接相反(很少使用,因爲左連接被更頻繁地使用)
  • 外聯接 - 數據或者行中的輸出
  • 加入而不作爲創建數據/交叉連接 - 返回這兩個表

對於實例之間的行的每一種組合:

表A:1,2,3,4-
表B:5,6-
交叉連接A,B:(1 5),(2,5),(3,5),(4,5),(1,6),(2,6),(3,6),(4,6 )

請注意,內連接以交叉連接開始,但受ON子句的限制。它基本上是一種在更方便的位置(在連接中而不是在哪裏)指定連接條件的方式。外部連接在概念上可以被認爲是內部連接,將空白行添加到可選表中(當且僅當沒有其他行匹配時才匹配)。

+2

就我個人而言,如果我先放入內連接然後離開連接然後交叉連接,我發現我犯的錯誤也少得多。 – HLGEM

+2

@HLGEM:確實如此,我很難搞清楚查詢所要查找的內容是否按照目的分組,以便儘可能通用。理想情況下,您從最一般的術語開始,然後進入更多細節(通常遵循您提到的模式)。 – Guvante

+0

這比你更直接指向OP。 – HLGEM