DISTINCT进入SQL语句不能很好地工作

问题描述:

下面的代码工作正常,一个问题显示了许多记录,它假设只显示一个。 (例如:如果从用户的UserInfo表有10个广告到广告表,其中这些广告5具有相似的查询字符串结果值值,所以他重复用户的5倍它假设出现一次什么他所拥有的广告,其中Wtag列。)DISTINCT进入SQL语句不能很好地工作

if (Request.QueryString["Searchfor"] != null) 
         { 

          using (SqlConnection srcbizhsql = new SqlConnection(sc)) 
          { 

           srcbizhsql.Open(); 
           SqlDataAdapter DAsearchbiz = new SqlDataAdapter(@"SELECT DISTINCT UI.[UID],UI.[Country],UI.[State],UI.[City],UI.[Logo],UI.[Website],UI.[UsrType],UI.[BizCateg],UI.[BizSubCateg],UI.[Twitter],UI.[GooglePlus],UI.[Facebook],UI.[CompNme],UI.[RegDate] ,SUBSTRING([CompDesc],1,40) AS CompDesc ,AD.[Wtags] FROM UserInfo AS UI , ads AS AD WHERE UI.UID = AD.UID and UI.[Country]= @Location AND UI.[UsrType]= 'Business' AND CHARINDEX(@Wtag, AD.[Wtags])>0 ORDER BY UI.[RegDate] DESC", sc); 

           DataSet DSsrchBiz = new DataSet(); 

           DAsearchbiz.SelectCommand.Parameters.AddWithValue("@Location", cookie.Value); 
           DAsearchbiz.SelectCommand.Parameters.AddWithValue("@Wtag", result); 

           DAsearchbiz.Fill(DSsrchBiz); 
           SrchbizHomLstviw.DataSource = DSsrchBiz.Tables[0]; 
           SrchbizHomLstviw.DataBind(); 
           SrchMultiView.ActiveViewIndex = 1; 
           RebindAds(); 
           RebindJobs(); 

          } 
         } 
+0

查询复制到SSMS和手动检查什么不同呢? – CodeNotFound

+0

@CodeNotFound我之前尝试过,但在SSMS中很难做到,因为查询字符串假设存在 – samo

+0

FOr me我认为这是SUBSTRING([CompDesc],1,40)或AD。[Wtags]导致您的问题 – CodeNotFound

你真的应该开始使用ANSI-92式的连接,而不是旧的ANSI-89的风格。语法已经有20多年了。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx

以下是您的查询与“现代”连接和一些格式。

SELECT DISTINCT UI.[UID] 
    , UI.[Country] 
    , UI.[State] 
    , UI.[City] 
    , UI.[Logo] 
    , UI.[Website] 
    , UI.[UsrType] 
    , UI.[BizCateg] 
    , UI.[BizSubCateg] 
    , UI.[Twitter] 
    , UI.[GooglePlus] 
    , UI.[Facebook] 
    , UI.[CompNme] 
    , UI.[RegDate] 
    , SUBSTRING([CompDesc], 1, 40) AS CompDesc 
    , AD.[Wtags] 
FROM UserInfo AS UI 
JOIN ads AS AD ON UI.UID = AD.UID 
WHERE UI.[Country] = @Location 
    AND UI.[UsrType] = 'Business' 
    AND CHARINDEX(@Wtag, AD.[Wtags])> 0 
ORDER BY UI.[RegDate] DESC 

但是我不明白是什么问题。对所有已定

+0

问题是有两个表UserInfo和广告,所以网站访问者将写入一个单词到搜索文本框,所以这个单词是(结果查询字符串),所以UserInfo表有很多用户信息和这些用户将他们的广告添加到广告表。所以当网站访问者搜索丰田时,它假设向广告表中的广告包含丰田广告的用户信息显示Wtag列。所以问题是,例如,如果肖恩兰格有40个广告进入广告表30,他们有丰田值转换为Wtag,那么它会显示30,它假设只显示一条记录 – samo

+0

然后从查询中删除AD.Wtags或使用top 1 (如果你使用top 1,你还应该包括一个order by)。 –

+0

没办法删除AD.Wtags这是代码的主要部分,我没有尝试过1,但我不认为它会工作。 – samo

由于经过多次尝试如下

SELECT DISTINCT UI.[UID] ,UI.[Country] ,UI.[State] ,UI.[City] ,UI.[Logo] ,UI.[Website] ,UI.[UsrType] ,SUBSTRING(UI.[CompDesc], 1, 60) AS CompDesc ,UI.[BizCateg] ,UI.[BizSubCateg] ,UI.[Twitter] ,UI.[GooglePlus] ,UI.[Facebook] ,UI.[CompNme] ,UI.[RegDate] FROM UserInfo AS UI JOIN (SELECT DISTINCT ads.[UID] FROM ads WHERE CHARINDEX(@Wtag, ads.[Wtags])> 0) AS AD ON AD.[UID] = UI.[UID] WHERE UI.[Country] = @Location AND UI.[UsrType] = 'Business' ORDER BY UI.[RegDate] DESC