【问题标题】:Inner join not returning desired result内部联接未返回所需结果
【发布时间】:2015-08-26 13:08:23
【问题描述】:

我正在使用以下查询查询我的数据:

  Select  
  Convert(varchar(50),PE.dateofstay,103) 'Date of Stay',  
  C.embossname 'EmbossName',  
  PE.pastexperience,  
  U.UserName ,  
  M.merchantname1   
  from card C   
 inner join PastExperience PE on c.EmbossLine=PE.embossline   
 inner join Users U on U.UserId=PE.userid  
 inner join Merchant M on M.MerchantID=U.MerchantID  
    where C.Embossline = '02563987' 
-- and (C.EmbossName Like '%DANIEL MWANGALA%' )
 AND(PE.dateofstay>='2013-11-03 00:00:00.000' and PE.dateofstay<='2015-11-03 00:00:00.000')  

问题是当我用EmbossLine 过滤它时,我得到了想要的结果,但是当我试图用EmbossName 过滤它时(我已经在这里评论过) 我什么都没有?我这么坚持这个?为什么会这样?

【问题讨论】:

  • 提供样本数据。
  • 你确定你得到像DANIEL MWANGALA这样的EmbossName,而不是例如DANIEL &lt;multiple_spaces_or_tab&gt; MWANGALA。搜索LIKE '%phrase%' 也是非常糟糕的做法,因为它不支持SARG
  • 该查询在语法上没有任何问题。我们需要查看您的数据,以了解为什么没有退回带有该 EmbossName 的卡片。
  • 你确定你有记录EmbossName 包含DANIEL MWANGALA
  • 你的标题也有误导性

标签: sql-server filter inner-join where-clause


【解决方案1】:

简答:您的数据库没有任何记录与您的所有四个 WHERE 子句条件匹配。

你可以做什么: 您已经将EmbossName 隔离为有问题的孩子,现在您需要了解为什么您尝试返回的特定记录与您最初指定的格式不匹配。尝试使搜索更简单,例如:

WHERE C.Embossline = '02563987' 
AND C.EmbossName LIKE '%DAN%'
AND PE.dateofstay >= '2013-11-03 00:00:00.000'
AND PE.dateofstay <= '2015-11-03 00:00:00.000'

如果可行,您可以将其升级为更具体的内容,例如

AND C.EmbossName LIKE '%DANIEL%MWANGALA%'

如果失败,请仅查找您确定应该匹配的 EmbossName 记录(没有来自此查询的所有其他连接信息),然后将该值复制并粘贴到文本编辑器中以查找其他可能的字符等在格式化的 GUI 中不太明显。

您的一个或多个INNER JOIN 条件也可能会造成问题 - 如果此 Daniel 伙伴存在于 C 但在您加入的其他表中没有任何相应数据,则不会显示任何结果。尝试将其中一些INNER JOINs 更改为LEFT OUTER JOIN,看看是否有任何结果。如果您在连接的列中得到一些带有NULL 值的行,那么您连接的表很可能没有此人的任何对应记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2018-07-24
    • 2019-07-31
    相关资源
    最近更新 更多