T-SQL查询帮助:连接2个不同的详细信息表

时间:2013-07-01 12:44:09

标签: sql tsql sql-server-2008-r2

对于所有SQL专家来说,这可能很简单...... 我有一个包含3个主表的数据库,并希望使用不同的结果集总和来连接两个详细信息表。请参阅下面的详细信息......

Customer
-------------
ID
NAME
...

Projects
-------------
ID
CustomerID
ProjectName
ProjectStatus
...

Orders
-------------
ID
CusomterID
OrderDate
...

现在我想做一个查询,它会返回所有拥有开放项目(1个或更多)的客户以及按客户分组的最后5个订单。

结果可能如下所示

Customer1
Project Build website 
Project Do SEO
Orders:
2013-04-13 10.000$
2012-01-20  5.000$
2011-10-11  2.000$

Customer2
Project update system 

Orders:
2012-01-20  5.000$
2011-10-11  2.000$

.... and so on

因此订单和项目没有关系,它们可能不一定具有相同的行数。这是我卡住的地方,因为查询只返回一个包含所有子查询总和的表。

或者运行单独的查询会更好吗?

我正在使用带有SERVER 2008R2的T-SQL。

也许我只是想复杂,但任何帮助都会很棒......

2 个答案:

答案 0 :(得分:0)

类似的东西:

SELECT c.NAME,
       p.ProjectName,
       o.*
FROM Customer c
LEFT JOIN Projects p
  ON p.CustomerID = c.ID
LEFT JOIN Orders o
  ON o.CusomterID = c.ID
WHERE p.ProjectStatus = 'Open'
AND o.ID IN (SELECT TOP 5 o2.ID
             FROM Orders o2
             WHERE o2.CusomterID = c.ID
             ORDER BY o2.OrderDate Desc)

答案 1 :(得分:0)

输出的格式(客户标题,项目部分标题,订单部分标题等问题)最好在应用层处理(例如,在SSRS报告,ASP等中)。

您可以返回单个查询中所需的所有数据,如下所示:

select c.NAME CustomerName, sq.*
from Customers c
join (select CustomerID, ID ProjectID, ProjectName, ProjectStatus, 
             'Projects' RecType, null OrderID, null OrderDate, null OrderValue
      from Projects
      union all
      select CustomerID, null ProjectID, null ProjectName, null ProjectStatus,
             'Orders' RecType, ID OrderID, OrderDate, OrderValue
      from Orders) sq
  on c.ID = sq.CustomerID
order by sq.CustomerID, sq.RecType desc, sq.ProjectID, sq.OrderID