查询似乎没有产生正确的结果

时间:2017-01-09 16:02:47

标签: sql sql-server left-join

我有一个包含三个字段的表,看起来像这样...........

tblValues

NameFrom          NameTo            Difference
abbbb             arrrr             16
acccc             agggg             20
adddd             annnn             17

我的查询看起来像这样......

Select 'From' = tblValues.NameFrom, 
       'To' = tblValues.NameTo, 
       TblValues.Difference, 
       'Other' = x1.Difference
from   tblValues
  LEFT JOIN tblValues X1 
    ON tblValues.NameFrom = X1.NameTo 
   AND tblValues.NameTo = X1.NameFrom 
WHERE  tblValues.NameFrom Like '%a%' OR tblValues.NameTo Like '%a%'
ORDER  BY tblValues.NameFrom, tblValues.NameTo

我允许用户在这种情况下搜索文本值' a'。我有大约30000个值,任何人都不会编辑/更新。他们已经进入这张桌子,并且已经按原样进入。

数据看起来像这样......

From       To         Difference       Other
abbbb      arrrr      16               16
....       ....
'Same for all the values - or at least that's what it should be!

我遇到的问题是,当我运行此查询时,有一些记录,其中OTHER = NULL - 即使差异有值。知道为什么吗?

3 个答案:

答案 0 :(得分:2)

您正在使用此行

选择other的值
LEFT JOIN tblValues X1 ON tblValues.NameFrom = X1.NameTo

你用它显示它:

'Other' = x1.Difference

LEFT JOIN表示:加入此表格。如果没有连接记录返回NULL。如果有一个(或者如果有多个),则返回所有这些。

对于您的查询,您将加入与源表相同的表,这意味着:

每当找不到记录时,tblValues.NameFrom = X1.NameTo此字段other将保持为NULL ...为什么会发生这种情况,没有人可以从外面告诉您...

答案 1 :(得分:1)

您希望将LEFT JOIN更改为JOIN,请在此处查看SQL连接的图形说明:https://stackoverflow.com/a/406333/2054629

基本上左连接意味着

  • 表A中的所有行
  • 如果找到则匹配表B的行,否则为NULL

答案 2 :(得分:1)

如果表tblValues NameFrom没有相应的NameTo值,则X1表中的结果为NULL。左连接包括来自tblValues的所有记录,即使X1中没有相应的匹配也是如此。使用INNER JOIN:

Select 'From' = tblValues.NameFrom, 'To' = tblValues.NameTo, TblValues.Difference, 'Other' = x1.Difference
from tblValues
INNER JOIN tblValues X1 ON tblValues.NameFrom = X1.NameTo 
AND tblValues.NameTo = X1.NameFrom 
WHERE tblValues.NameFrom Like '%a%' OR tblValues.NameTo Like '%a%'
ORDER BY tblValues.NameFrom, tblValues.NameTo