2015-04-29 75 views
1

我是sql的新手。 我有這些表中:與sql連接陷阱

表個人:

IndividualId IndividualName 
Ind1   Mark 
Ind2   Paul 
ind3   Spencer 
ind4   Mike 
ind5   Hilary 

表代理:

AgentId  IndId(foreignKey) 
Agent1  ind1 
Agent1  ind2 
Agent2  ind1 
Agent3  ind4 

事務表(事務可以經由代理或由個體本人進行) :

TranId IndId(foreignKey/Never Null) AgentId(foreignKey) TranAmount 
Tran1 ind1       Agent1    $100 
Tran2 ind1       NULL     $500 
tran3 ind3       NULL     $200 
tran4 ind4       Agent3    $50 
tran5 ind4       NULL     $30 

結果應該是這樣的:

IndividualId IndividualName AgentId TranId TranAmount 
Ind1   Mark   Agent1  Tran1  $100 
Ind1   Mark   Agent2  NULL  NULL 
Ind1   Mark   NULL  Tran2  $500 
Ind2   Paul   Agent1  NULL  NULL 
Ind3   Spencer   NULL  Tran3  $200 
ind4   Mike   Agent3  tran4  $50 
ind4   Mike   NULL  tran5  $30 
ind5   Hilary   NULL  NULL  NULL 

按照一些評論(如果交易與代理相關聯,則在單獨的行中同一行別的顯示顯示)中,i使用以下查詢:

SELECT DISTINCT IndividualId, IndividualName, TranId, Agent.AgentId, Amount 
FROM Individual 
LEFT JOIN Transactions 
ON Individual.IndividualId = Transactions.IndId 
LEFT JOIN Agent 
ON Transactions.AgentId = Agent.AgentId 

這給了下面的成果,這是不正確:

IndividualId IndividualName TranId AgentId Amount 
ind1   Mark   Tran1 Agent1 100 
ind1   Mark   Tran2 null 500 
ind2   Paul   null null null 
ind3   Spencer   Tran3 null 200 
ind4   Mike   Tran4 Agent3 50 
ind4   Mike   Tran5 null 30 
ind5   Hilary   null null null 
+2

請顯示您的SQL查詢 – Hiten004

+0

我的sql查詢沒有給出正確的結果。所以我認爲它會讓你們脫離軌道。我已經給出了表格和結果集應該是什麼。非常簡單。 –

+1

看看這些可視化示例中的「left outer join」如何工作http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/看起來您希望所有來自Individual和那些匹配的記錄來自代理人以及與個人相匹配的所有交易記錄。因此,從單獨的「左連接」開始到事務處理,再從「左連接」開始到代理程序。個人有交易。交易與代理有關。事務可以在沒有代理的情況所以個人交易給代理人。 (每次都是左連接)嘗試一下,然後發佈你所做的事情。 – xQbert

回答

1

試試這個:

SELECT Distinct IndividualId, IndividualName, Agent.AgentId, TranId, Amount 
FROM Individual 
Left join Agent ON Individual.IndividualId = Agent.IndId 
left join Transactions 
    on Individual.IndividualId = Transactions.IndId and Transactions.AgentId = Agent.AgentId 
    union 
    SELECT Distinct IndividualId, Name, TranId,NUll as AgentId, Amount 
FROM Individual 
left join Transactions 
    on Individual.IndividualId = Transactions.IndId and Transactions.AgentId is null 
+1

修正了一些小錯字的訂單上面...這裏的[小提琴](http://sqlfiddle.com/#! 6/0855af/1/0)不完全正確,但太多3的 – xQbert

+0

這對我有效。我確實得到了一些NULL值的行,但我可以輕鬆地與它們一起消失。除了那些我需要的,因爲實際的查詢有一些其他的表以相同的方式加入並且有這些NULL幫助。在最後一步,我擺脫了空的 –

0

http://sqlfiddle.com/#!6/0855af/7

在3個零件

分佈式查詢:

1)交易而與代理

2)交易沒有代理

3)個別&代理映射在不使用事務

SELECT IndividualId, IndividualName, Agent.AgentId, TranId, TranAmount 
FROM Individual 
Inner join Agent 
    ON Individual.IndividualId = Agent.IndId 
Inner join Transactions 
    on Individual.IndividualId = Transactions.IndId 
    and Transactions.AgentId = Agent.AgentId 
    union 
SELECT IndividualId, IndividualName, NUll as AgentId, TranId,tranAmount 
FROM Individual 
left join Transactions 
    on Individual.IndividualId = Transactions.IndId 
    and Transactions.AgentId is null 
    union 
SELECT IndividualId, IndividualName, NUll as AgentId, TranId,tranAmount 
FROM Individual 
Inner join Agent 
    ON Individual.IndividualId = Agent.IndId 
left join Transactions 
    on Individual.IndividualId = Transactions.IndId 
    and Transactions.AgentId = Agent.AgentId 
    where Transactions.tranID is null 
+0

沒有這裏的小提琴顯示結果不匹配[Fiddle](http://sqlfiddle.com/#!6/0855af/2/0) – xQbert

+0

@xQbert做了一個編輯。 。 –

0

我認爲問題在於您要將事務表加入代理表(當不是每個事務都有代理時),這意味着您的結果集不包含沒有代理的事務。由於事務表本身已經有一個AgentId列,所以你不需要聯合結果來查看事務的代理。我假定預期結果中的列具有以下關聯(因爲同一列在多個表中,這個假設很重要):IndividualId和IndividualName來自Individual表,TranId和AgentId,以及TranAmount是交易表的結果。 我只包括加入到代理表,如果您決定要代理人姓名返回,否則你甚至不需要它。

SELECT I.IndividualId, I.IndividualName, T.AgentId, T.TranId, T.TranAmount 
FROM Individual I 
LEFT JOIN Agent A ON I = IndId = A.IndId 
LEFT JOIN Transactions T ON I.IndID = T.IndID 

希望這是你正在尋找的!