-1

2 つのテーブルにまたがるデータを持つアプリケーションがあります。

Id 、 Name 、 Type の列を持つメイン テーブル Main があります。これで、MainId(FK)、StartDate、Enddate、city という列を持つ Sub Main テーブルができました。これは 1 対多の関係です (各メインは submain に複数のエントリを持つことができます)。

ここで、列 Main.Id、City (サブメインからのそのメイン項目のさまざまな行からカンマで区切られたもの)、開始日の最小値 (そのメイン項目のサブメインから) および終了日の最大値 (サブメインから) を表示したいと考えています。

関数を持つことを考えましたが、100k レコードになるため、処理が遅くなります。これを行う他の方法はありますか?ところで、アプリケーションはasp.netにあります。SQL クエリや linq のようなものを使用できますか?

4

3 に答える 3

1

これは私の頭の中にありますが、最初に SQL でユーザー定義関数を作成して、@mainid を受け入れる都市のコンマ区切りリスト文字列を作成し、次のことを行うことをお勧めします。

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' , '') + city
FROM submain
WHERE mainid = @mainid

...そして @listStr を返します。これは、都市のカンマ区切りのリストになります。関数 MainIDCityStringGet() を呼び出すとしましょう

次に、最終結果については、次のコマンドを実行するだけです

select cts.mainid,
       cts.cities,
       sts.minstartdate,
       sts.maxenddate
  from ( select distinct mainid,
                         dbo.MainIDCityStringGet(mainid) as 'cities'
           from submain) as cts
         join
       ( select mainid,
                min(startdate) as 'minstartdate',
                max(enddate)   as 'maxenddate'
           from submain
          group by mainid ) as sts on sts.mainid = cts.mainid
 where startdate <is what you want it to be>
   and enddate   <is what you want it to be>

startdate と enddate でどの程度正確にフィルター処理したいかによっては、各サブクエリ内に where フィルターを配置する必要があり、結合の 2 番目のサブクエリに HAVING グループ化フィルターを使用する必要がある場合があります。フィルターの性質を明確に述べていませんでした。

それが役立つことを願っています。

もちろん、これはストアドプロシージャになります。デバッグが必要な場合があります。

于 2012-09-26T22:14:42.327 に答える
0

ストアドプロシージャを作成する代わりに、クライアント側で複雑な操作を実行することもできます。(未テスト):

var result = (from main in context.Main
              join sub in context.SubMain on main.Id equals sub.MainId into subs
              let StartDate = subs.Min(s => s.StartDate)
              let EndDate = subs.Max(s => s.EndDate)
              let Cities = subs.Select(s => s.City).Distinct()
              select new { main.Id, main.Name, main.Type, StartDate, EndDate, Cities })
             .ToList()
             .Select(x => new
                          {
                              x.Id,
                              x.Name,
                              x.Type,
                              x.StartDate,
                              x.EndDate,
                              Cities = string.Join(", ", x.Cities.ToArray())
                          })
             .ToList();
于 2012-09-27T02:41:41.600 に答える