2011-05-18 89 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