2017-01-09 69 views
0

我有三个字段的表,看起来像这样...........查询似乎并没有产生正确的结果

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! 

我的问题是,当我运行此查询有一些记录,而其他= NULL - 即使有差别的值。任何想法为什么?

+0

我知道这可以简单地做另一种方式 - 但这个查询是由别人写的,虽然我不想改变它 - 我想知道为什么它不会产生有效数据(NULL值) – BobSki

回答

2

你与该行采摘other

LEFT JOIN tblValues X1 ON tblValues.NameFrom = X1.NameTo 

然后显示它:

'Other' = x1.Difference 

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

您的查询,在那里你将加入同一个表作为源表,这意味着:

每当有没有记录发现,在tblValues.NameFrom = X1.NameTo这一领域other将保持空...为什么发生这种情况无人能从外部告诉你...

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