1

私は次のクエリを持っています:

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'   

enabled = 1でretailerIdを使用すると、すべきではないのにまったく同じ結果が得られます。結果ははるかに少なくなるはずです。

私はそれが何か簡単なことだと確信していますが、それは私を怒らせます!助けていただければ幸いです

編集:

私が実際に行う必要があるのは、基本的に結果を得るために3つのステートメントを書くことです。これもどのように行うかは定かではありませんが、これはステートメントが行う必要があることです(平易な英語で):

  1. affiliateretailerテーブルから*を選択します。ここでmanufacturerid=46およびenabled=true

  2. 小売業者がmanufacturerid=46である上記の選択に残っているものである場合、manufacturerRetailerから*を選択します。

  3. select * from widgetClicks join on retialer d where productid = abc and wc.CreatedAt> = '2011-10-31 00:00:00.000' and wc.CreatedAt <= '2012-03-31 00:00:00.000'

編集 **

右私は私が欲しいSQLクエリを持っています...

    SELECT COUNT(*) 
    FROM WidgetClicks 
    WHERE CreatedAt >= '2011-10-31 00:00:00.000' 
    and CreatedAt <= '2012-03-31 00:00:00.000' 
    and ProductId = 6914 
    AND RetailerId in (
                        SELECT RetailerId 
                        FROM AffiliateUpdateFiles auf
                        WHERE auf.Enabled = 1 AND auf.ManufacturerId = 46 and RetailerId <> 189
                        )
    AND ManufacturerWidgetId in (
                                select id 
                                from ManufacturerWidgets 
                                where  ManufacturerId = 46 and CountryId = 72
                                )

これがthugです-私は実際にLinqでそれを必要としています-誰かが私のためにそれを変換することができればそれはありがたいです...私は行くでしょう!

4

3 に答える 3

1

代わりに、LEFTOUTERJOINを使用してみてください。これにより、結合されたテーブルに対応する行がない場合でも、WidgetClicksからの結果が返されます。

結合をLEFTOUTERJOINに変更した後、期待する行が得られる場合は、結合されたテーブルのデータを調べてください。期待する行が含まれていません。

于 2012-04-16T17:35:48.450 に答える
0

上記を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();
        }
于 2012-04-20T13:31:07.427 に答える
0

結合の構造を考えると、WHERE句から「ad」テーブルフィルターを削除しても効果がない場合は、ab-to-aa結合またはab-to-ac結合がそれらのWHEREのために物事をフィルターで除外していることを示します。条項。

ab -- aa -- ad
|
ac

したがって、広告フィルターをWHERE句に残してみてください。ただし、残りを削除してから1つずつ追加し直して、どのWHEREフィルターが予想よりも少ない結果を引き起こしているかを確認してください。物事がフィルターで除外されている場所を確認したら、何を変更する必要があるかを判断し、場合によっては再構築することができます。その時点でいくつかのOUTER結合を使用するか、エイリアステーブルへの結合を作成することができます。例:X JOIN(Y OUTER JOIN Z WHERE ...)AS Q ON X.id = Q.id WHERE .. ..

于 2012-04-16T17:42:02.373 に答える