2016-05-30 252 views
1

我想加入使用contactno列,當我只運行dbo.contact查詢SQL左連接返回更多的記錄比預期

SELECT  
    contactno, date_recd 
FROM   
    dbo.contact 
WHERE  
    (date_recd > CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 
    AND (date_recd <= CONVERT(DATETIME, '2016-04-01 00:00:00', 102)) 

我得到11526條記錄兩個表dbo.contactdbo.notes但是當我加入notes

SELECT  
    dbo.contact.contactno, dbo.contact.date_recd, dbo.notes.noteline 
FROM   
    dbo.contact 
LEFT OUTER JOIN 
    dbo.notes ON dbo.contact.contactno = dbo.notes.contactno 
WHERE  
    (dbo.contact.date_recd > CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 
    AND (dbo.contact.date_recd <= CONVERT(DATETIME, '2016-04-01 00:00:00', 102)) 

然後我得到22276條記錄。我不確定發生了什麼問題。我只想得到所有11526如何做到這一點?任何幫助非常感謝。

+4

可能有不止一個'noteline'每'contactno' –

+0

@vkp但我問它只是給我所有的聯絡表中的列不應該只返回11526分的記錄,並在它不存在它應該是空的嗎? – CodeMan

+0

從查詢中刪除'noteline'並查看區別 –

回答

1

是的,執行左連接將返回第一個表中的所有行,並僅匹配第二個表中的行。但是,如果第二個表中的多行匹配,它將返回兩個行,這會導致第一個表中的行重複。

例如:

Table1 
ID Value 
1  A 
2  B 
3  C 

Table2 
ID Value 
1  X 
1  Y 
2  Z 

Select * from Table1 a 
left join Table2 b 
on a.ID = b.ID 

返回:

ID Value ID Value 
1  A  1  X 
1  A  1  Y 
2  B  2  Z 
3  C Null Null 

其中共有四排,即使Table1在本例中只有三個。爲了避免這種情況,您需要調整連接標準,以便每行最多隻有一個匹配項,或者添加一些重複步驟。

2

如果你想每個聯繫人只有一個音符,你可以使用outer apply

SELECT c.contactno, c.date_recd, n.noteline 
FROM dbo.contact c OUTER APPLY 
    (SELECT TOP 1 n.* 
     FROM dbo.notes n 
     WHERE c.contactno = n.contactno 
    ) n 
WHERE (c.date_recd > CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) AND 
     (dc.date_recd <= CONVERT(DATETIME, '2016-04-01 00:00:00', 102)); 

通常情況下,子查詢將有一個ORDER BY,指明哪些注意你想要的。但是,您的查詢並未指定多個註釋中的哪一個是首選註釋。

0

以上答案很棒,但我想發佈解決我的問題的代碼。所以我需要所有11526條記錄,但不僅是每個聯繫人的前1條直線,我想要所有的條形碼,所以我最終將記錄連接到單個字符串。

Select contact.contactno, 
STUFF((Select '' + notes.noteline FROM notes 
Where notes.contactno = contact.contactno 
order by notes.contactno for xml path (''),type).value('.','nvarchar(max)'),1,2,'') AS Notes 
From contact 
WHERE 
(contact.date_recd > CONVERT(DATETIME, '2015-12-31 00:00:00', 102)) 
AND 
(contact.date_recd <= CONVERT(DATETIME, '2016-04-01 00:00:00', 102)) 
Group By contact.contactno;