SQL issue语句返回相同的值,即使尝试使用where-nested query-convert to LINQ对fielld进行排序

SQL issue语句返回相同的值,即使尝试使用where-nested query-convert to LINQ对fielld进行排序,sql,linq,join,subquery,where-clause,Sql,Linq,Join,Subquery,Where Clause,我有以下疑问: select distinct(ab.id) from WidgetClicks ab join ManufacturerWidgets aa on ab.ManufacturerWidgetId = aa.Id join ManufacturerRetailers ad on aa.ManufacturerId = ad.ManufacturerId join Products ac on ab.ProductId = ac.Id wher

我有以下疑问:

select distinct(ab.id) 
from WidgetClicks ab
join  ManufacturerWidgets aa 
    on ab.ManufacturerWidgetId = aa.Id
join ManufacturerRetailers ad 
    on aa.ManufacturerId = ad.ManufacturerId
join Products ac 
    on ab.ProductId = ac.Id  
where ad.Enabled = 0 
    and ad.RetailerId = 189 
    and  aa.ManufacturerId = 46  
    and aa.CountryId = 72 
    and ac.Id = 6914 
    and ab.CreatedAt >= '2011-10-31 00:00:00.000' 
    and ab.CreatedAt <= '2012-03-31 00:00:00.000'   
select distinct(ab.id)
来自WidgetAB
加入ManufacturerWidgetAA
在ab.ManufacturerWidgetId=aa.Id上
加入制造商零售商广告
关于aa.ManufacturerId=ad.ManufacturerId
加入产品交流
在ab.ProductId=ac.Id上
其中ad.Enabled=0
和ad.RetailerId=189
和aa.ManufacturerId=46
aa.CountryId=72
和ac.Id=6914
和ab.CreatedAt>=“2011-10-31 00:00:00.000”

ab.CreatedAt='2011-10-31 00:00:00.000'和wc.CreatedAt尝试使用左外部联接。这将返回WidgetClicks的结果,即使联接表中没有相应的行


如果在将联接更改为左外部联接后发现得到了所需的行,请检查联接表中的数据-它们不包含所需的行。

尝试改用左外部联接。这将返回WidgetClicks的结果,即使联接表中没有相应的行


如果在将联接更改为左外部联接后发现获得了所需的行,则检查联接表中的数据-它们不包含所需的行。

给定联接的结构,如果从WHERE子句中删除“ad”表筛选器无效,这表明ab-to-aa连接或ab-to-ac连接由于WHERE子句而过滤掉了内容

ab -- aa -- ad
|
ac

因此,请尝试将广告过滤器保留在WHERE子句中,但删除其余部分,然后逐个将它们添加回去,以查看哪个WHERE过滤器导致的结果比您预期的要少。一旦你看到什么东西被过滤掉了,你就可以决定你需要改变什么——并可能进行重组。您可能希望在该点使用一些外部联接或创建别名表的联接,例如:X JOIN(Y OUTER JOIN Z WHERE…)AS Q ON X.id=Q.id WHERE…

给定联接的结构,如果从WHERE子句中删除“ad”表过滤器无效,这表明ab-to-aa连接或ab-to-ac连接由于WHERE子句而过滤掉了内容

ab -- aa -- ad
|
ac

因此,请尝试将广告过滤器保留在WHERE子句中,但删除其余部分,然后逐个将它们添加回去,以查看哪个WHERE过滤器导致的结果比您预期的要少。一旦你看到什么东西被过滤掉了,你就可以决定你需要改变什么——并可能进行重组。您可能希望在该点使用一些外部联接或创建别名表的联接,例如:X JOIN(Y OUTER JOIN Z WHERE…)AS Q ON X.id=Q.id WHERE…

以下是将上述转换为Linq的解决方案:

public int GetWidgetClicksForManufacturerCategoryModel(int manufacturerId, int countryId, int categoryId, int productId, DateTime myStartDate, DateTime myEndDate)
        {
            var widgetInCountry = (from mw in _er.ManufacturerWidgets
                                                where mw.ManufacturerId == manufacturerId && mw.CountryId == countryId
                                                select mw.Id).ToList();

            var enabledWidgets = (from auf in _er.AffiliateUpdateFiles
                        where auf.Enabled && auf.ManufacturerId == manufacturerId 
                        select auf.RetailerId).ToList();



            var widgetClicks = (from wc in _er.WidgetClicks
                          where wc.CreatedAt.CompareTo(myStartDate) >= 0 && wc.CreatedAt.CompareTo(myEndDate) <= 0 
                          && wc.ProductId == productId 
                          && enabledWidgets.Contains(wc.RetailerId) 
                          && widgetInCountry.Contains(wc.ManufacturerWidgetId)
                                               select wc.Id);

            return widgetClicks.Count();
        }
public int-GetWidgetClicksForManufacturerCategoryModel(int-manufacturerId、int-countryId、int-categoryId、int-productId、DateTime-myStartDate、DateTime-myEndDate)
{
var widgetInCountry=(来自制造商Widget中的mw
其中mw.ManufacturerId==ManufacturerId&&mw.CountryId==CountryId
选择mw.Id).ToList();
var enabledWidgets=(来自_er.AffiliateUpdateFiles中的auf
其中auf.Enabled&&auf.ManufacturerId==ManufacturerId
选择auf.RetailerId).ToList();
var widgetClicks=(来自_er.widgetClicks中的wc

其中wc.CreatedAt.CompareTo(myStartDate)>=0&&wc.CreatedAt.CompareTo(myEndDate)以下是将上述内容转换为Linq的解决方案:

public int GetWidgetClicksForManufacturerCategoryModel(int manufacturerId, int countryId, int categoryId, int productId, DateTime myStartDate, DateTime myEndDate)
        {
            var widgetInCountry = (from mw in _er.ManufacturerWidgets
                                                where mw.ManufacturerId == manufacturerId && mw.CountryId == countryId
                                                select mw.Id).ToList();

            var enabledWidgets = (from auf in _er.AffiliateUpdateFiles
                        where auf.Enabled && auf.ManufacturerId == manufacturerId 
                        select auf.RetailerId).ToList();



            var widgetClicks = (from wc in _er.WidgetClicks
                          where wc.CreatedAt.CompareTo(myStartDate) >= 0 && wc.CreatedAt.CompareTo(myEndDate) <= 0 
                          && wc.ProductId == productId 
                          && enabledWidgets.Contains(wc.RetailerId) 
                          && widgetInCountry.Contains(wc.ManufacturerWidgetId)
                                               select wc.Id);

            return widgetClicks.Count();
        }
public int-GetWidgetClicksForManufacturerCategoryModel(int-manufacturerId、int-countryId、int-categoryId、int-productId、DateTime-myStartDate、DateTime-myEndDate)
{
var widgetInCountry=(来自制造商Widget中的mw
其中mw.ManufacturerId==ManufacturerId&&mw.CountryId==CountryId
选择mw.Id).ToList();
var enabledWidgets=(来自_er.AffiliateUpdateFiles中的auf
其中auf.Enabled&&auf.ManufacturerId==ManufacturerId
选择auf.RetailerId).ToList();
var widgetClicks=(来自_er.widgetClicks中的wc

其中wc.CreatedAt.CompareTo(myStartDate)>=0&&wc.CreatedAt.CompareTo(myEndDate)如果你去掉
启用的
零售id
,它不应该返回更多的结果吗?对不起,这就是我的意思-我在启用=1和零售商id时得到了更多的结果,而我期望得到的结果更少。如果去掉
启用的
零售id
,它不应该返回更多的结果吗?对不起,这就是我的意思-我得到了更多启用=1且零售商id为时的结果,我希望得到更少的结果