【问题标题】:Record exists in both tables but disappears with the where clause记录在两个表中都存在,但随着 where 子句消失
【发布时间】:2015-02-21 03:42:04
【问题描述】:

以下表格有记录“FF Studios”,但是当我运行查询时,我没有看到任何记录。

Select *
from ( Select Name,
              Ref_name,
              Final_Name = CASE
                           WHEN _Similarity >=0.80
                            and _Match ='Solid Matched'
                            and Owner IS NOT NULL
                           THEN Ref_Name
                           ELSE Name
                           END, 
              Address,
              City,
              Province,
              [Postal Code],
              Country,
              Phone,
              Fax,
              Owner
              _Similarity,
              _Match
       from Customer_Stage3
     ) as a
WHERE a.Final_Name LIKE ('%FF St%')
  and ( a.Final_Name IN ( Select Customer_Clean 
                          from SFCustomerMerge 
                          Group BY Customer_Clean 
                          HAVING COUNT(Customer_Clean) > 1
                        ) 
      )
order by a._Similarity

在这种情况下,记录存在于 SFCustomerMerge 表和客户阶段 3 中,但是当我添加第一个 Where 子句时它消失了,我检查了查询

Select Customer_Clean
from SFCustomerMerge 
Group BY Customer_Clean 
HAVING COUNT(Customer_Clean) > 1

记录也出现在那里。

我错过了什么?我也知道这条记录的相似度是 0.98,匹配是实心匹配,所有者不是 NULL。

【问题讨论】:

  • 可能所有者不是null 而是一个空字符串?试试IsNull(owner, '') != ''。或者a.Final_NameCustomer_Clean的某种区分大小写的问题?
  • 我也仔细检查过。如果我将 AND 更改为 OR,它会起作用并且我会看到结果。所以这让我认为内部查询 Select Customer_Clean... 有问题,但我也确实在那里看到了结果。
  • 或者名称不完全一样。例如,名称中可能包含非标准字符。可以使用ASCII()查看字符的ascii值。
  • 它们是一样的。 where 子句有问题吗?

标签: sql sql-server-2008-r2


【解决方案1】:

是 WHERE 子句中的额外括号吗?你试过了吗:

WHERE a.Final_Name IN (SELECT Customer_Clean
                       FROM SFCustomerMerge
                       GROUP BY Customer_Clean
                       HAVING COUNT(Customer_Clean) > 1)

其他一切看起来都很好,所以这是我能看到的唯一可能导致它的原因。

【讨论】:

    【解决方案2】:

    我将首先查看正在使用的排序规则序列。区分大小写可能会在这里发挥作用。进一步......嵌入式空格怎么样?是不是一模一样?

    但是,出于性能原因,我可能会将您的查询重构为如下内容:

    select cs3.Name,
           cs3.Ref_name,
           cs3.Final_Name = case
                              when _Similarity >=0.80
                               and _Match ='Solid Matched'
                               and Owner IS NOT NULL
                              then Ref_Name
                              else Name
                            end, 
           cs3.Address,
           cs3.City,
           cs3.Province,
           cs3.[Postal Code],
           cs3.Country,
           cs3.Phone,
           cs3.Fax,
           cs3.Owner
           cs3._Similarity,
           cs3._Match
    from Customer_State3 cs3
    join ( Select cm.Customer_Clean 
           from SFCustomerMerge cm
           where cm.Customer_Clean like '%FF St%'
           Group BY cm.Customer_Clean 
           HAVING COUNT( cm.Customer_Clean ) > 1
         ) dupes on dupes.Customer_Clean = case
                                             when cs3._Similarity >= 0.80
                                              and cs3._Match       = 'Solid Matched'
                                              and cs3.Owner        is not NULL
                                             then cs3.Ref_Name
                                             else cs3.Name
                                           end = dupes.Customer_Clean
    order by cs3._Similarity
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多