在不同条件下加入相同的表格

时间:2013-11-13 12:42:55

标签: sql linq

我有3张桌子。

  • 用户(字段:用户ID和名称)
  • MonthsMap(字段:UserId,Month,orderId)
  • OrderTable(字段:OrderId,Order Quntity等)

我的要求是这样的:

如果用户订购了Novemeber,请显示Novemeber订单,否则显示10月份的订单。

目前我正在做的是

foreach(user)
{
    join User table with MonthsMap table where month = november
    if( result is null )
    {
        join User table with MonthsMap table where month = october join order table to get October order details
    }
    else
    {
        join User table with MonthsMap table where month = november join order table to get november order details
    }
}

循环用于迭代每个用户需要很多时间。我正在使用Linq to SQL,并且有任何更好的Linq选项,我可以使用它来获取所有用户;单个查询中的顺序。

感谢您的所有答案,但很抱歉我的例子让您感到困惑。确切的情况是这样的,用户可以有不同类型的订单(例如: - 正常订单和紧急订单)。所以现在而不是months_map表我将使用订单映射表(字段用户ID,order_type(“正常/紧急/非常紧急”),order_id)

所以我的应用程序必须列出用户表中所有用户的订单。

列表应该是

  • 如果用户有非常紧急的订单,应用程序必须只显示他非常紧急的订单
  • 如果用户有紧急订单,则应用程序必须仅显示其紧急订单
  • 如果用户订单正常,则应用程序必须仅显示正常订单
  • 其他只显示用户名,订单详细信息留空。

3 个答案:

答案 0 :(得分:0)

我猜你需要共同的最后/前几个月,而不是十月十一月/十一月。如果是,则使用以下算法:
从Users / MonthMap / OrdersTable的内部联接中选择*,其中OrderTable.MonthNo =当前用户的OrderTable.MonthNo的最大值。

var result =
    from u in users
    join mm in mms on u.UserId equals mm.UserId
    join ot in ots on mm.OrderId equals ot.OrderId
    where mm.MonthNo == (
                            from mm1 in mms
                            where mm1.UserId == u.UserId
                            select mm1.MonthNo
                        ).Max()
    select new {u, mm, ot};

答案 1 :(得分:0)

就个人而言,我会用SQL编写查询,并会解决类似这样的问题:

SELECT user.userid
     , user.name
     , october_orders.orderquantity
     , november_orders.orderquantity
     , Coalesce(october_orders.orderquantity, november_orders.orderquantity)
FROM   user
 LEFT
  JOIN monthsmap
    ON monthsmap.userid = user.userid
 LEFT
  JOIN ordertable As october_orders
    ON october_orders.orderid = monthsmap.orderid
   AND monthsmap.month = 'october'
 LEFT
  JOIN ordertable As november_orders
    ON november_orders.orderid = monthsmap.orderid
   AND monthsmap.month = 'november'

玩游戏,看看你是怎么过的。

答案 2 :(得分:0)

试试这个sql

select ot.*
  from OrderTable ot, MonthsMap mm
 where ot.orderid = mm.orderid
   and mm.userid = :userid
   and mm.month = case
           when (select count(*)
                   from MonthsMap mm1
                  where mm1.userid = mm.userid
                    and mm1.month = 'november') > 0 then
            'november'
           else
            'october'
       end;