帮助T-SQL连接

时间:2011-05-18 03:21:38

标签: tsql sql-server-2008 join

所以我有一个表格将IP链接到名为tblIPMessageLink

的消息的投票/标记

它包含投票或标记的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

即使我执行此proc传递的链接表中不存在的IP,它仍然会被投票给该消息。它不应该,因为我从不同的IP投票。

我做错了什么?

3 个答案:

答案 0 :(得分:0)

我相信left join意味着查询将列出“左”(消息表)中表中的所有行,并显示相应的行或来自另一个表的空值(链接表) )。如果您将结果行的存在视为投票的存在,那就是您的问题。您将获取所有m行的值以及ml.votedml.flagged的NULL。

解决方案是在sproc中切换表的位置。

答案 1 :(得分:0)

根据您的评论

  

它在那些中返回'真''位   案件,何时应该返回   NULL。

并且在您发布的查询中我认为问题出在数据中。除了此字段或NULL之外,对特定字段的查询无法返回任何内容。如果你看到了true,那么true就是这个字段中存储的相应MessageId的内容你可以请:

  • 选择一个显示问题的MessageId
  • 在此MessageId上运行查询过滤并在此处发布结果记录集
  • 转储来自tblMessages的所有行,并选择MessageId并在此处发布
  • 使用选定的MessageId转储tblIPMessageLink中的所有行并在此处发布

如果您提供:

,这也会有所帮助
  • tblMessages的定义(以及键,约束等)
  • tblIPMessageLink的定义(以及键,约束等)

答案 2 :(得分:0)

想出来,我的连接线应该是这样的:

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