2011-05-18 61 views
0

所以我有一個鏈接IP對所謂tblIPMessageLink幫助T-SQL連接

它包含投票或標記的IP報文的票/標識的表,而對於位列「投票」和「標記」 。

getMessages PROC低於

SELECT 
    m.message, 
    m.votes, 
    m.messageId, 
    ml.voted, 
    ml.flagged, 
    NULL as rows 
FROM 
    tblMessages m 
left join tblIPMessageLink ml on m.messageid = ml.messageid 
WHERE 
    m.timestamp >= DATEADD(day, DATEDIFF(day, 0, @date), 0) 
    and 
    m.timestamp < DATEADD(day, DATEDIFF(day, 0, @date), 1) 
    and 
    datediff(hour,m.timestamp, getdate()) <= 2 
ORDER BY datediff(hour,m.timestamp, getdate()) DESC 

即使我Exec的這個PROC通過在不連接表中存在的IP,它仍然出來作爲投票贊成該消息。它不應該,因爲我從不同的知識產權投票。

我在做什麼錯?

回答

0

想通了,我的連接線應該看起來像這樣:

left join tblIPMessageLink ml on m.messageid = ml.messageid and ml.ip = @ip 
+0

你也可以把IP條件放在where子句中。似乎它會在那裏更有意義。 – 2011-05-23 19:10:31

0

我認爲left join意味着查詢將列出「左側」(消息表)中表中的所有行,並顯示相應的行或來自另一個表(鏈接表)的空值。如果您將結果行的存在視爲投票的存在,那就是您的問題。您將獲得所有m行的值,並獲取ml.votedml.flagged的NULL值。

解決方法是切換表格在存儲區中的位置。

+0

它返回正確的行,但投票/標記行的值不正確。在這種情況下,它返回一個'真'位,當它返回NULL時。 – slandau 2011-05-18 03:34:04

+0

@slandau - 你可以發佈更多的sproc嗎?即where子句或@lastId是什麼? – 2011-05-18 03:36:04

+0

添加了完整的select語句 – slandau 2011-05-18 03:56:52

0

基於您的評論

它返回在那些 情況下,「真正的」位,當它應該返回NULL 。

並在您發佈的查詢上我認爲問題出在數據中。沒有辦法查詢特定字段可以返回除該字段或NULL之外的任何內容。如果你看到真實的,那麼真實的是什麼是存儲在此字段對應的MessageId能否請您:

  • 選擇一個單一的MessageId表現出的問題
  • 運行您的查詢在此的MessageId過濾並張貼在這裏得到的記錄
  • 從選擇的MessageId tblMessages轉儲所有行和張貼在這裏
  • 轉儲全部來自tblIPMessageLink行與選擇的郵件ID以及張貼在這裏

它也請你提供:tblMessages的

  • 定義(連鍵,限制一起等)tblIPMessageLink的
  • 定義(連鍵,約束等一起)
+0

它應該返回相應的messageId和ip地址的值。 – slandau 2011-05-18 13:07:06

+0

IP地址不是您發佈的SQL查詢的一部分。既然你沒有在查詢中的任何地方使用它,它只是其中一個表的一個字段。如果你查詢它,它會和其他人一起返回。 – 2011-05-19 06:18:06

+0

這是我的問題,雖然:) – slandau 2011-05-19 13:07:58