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为时的结果,我希望得到更少的结果