我有一个包含三个字段的表,看起来像这样...........
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 - 即使差异有值。知道为什么吗?
答案 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。
基本上左连接意味着
答案 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