2013-10-16 99 views
2

这可能是不可能的,但有没有办法在表上交替行输出两个查询的结果?两个SQL查询的交替结果

例如,如果我有两个表试图显示一个窗口小部件与其类别中的所有窗口小部件,我会输出每个窗口小部件,接着是类别平均值,然后是窗口小部件2,并在下一行显示其类别平均值。这将导致4行。这都是假设小部件和它们的类别平均值在两个单独的表格中。

对不起,如果这是混乱,我可以澄清,如果我需要。我只是试图让最终应用程序在C#中显示非常简单。这可能会更容易做在实际的应用程序,但我不熟悉C#...

+0

有关查询两个表的连接和使用应用程序代码放置在第一行和别的东西在第二的东西是什么? –

+0

您可以使用T-SQL(两个游标) – Federico

+2

如果您有一个字段可以通过** union **和** order by ** – Federico

回答

0

这是可能的使用两个表变量,两个排序列在每个和联盟所有,但我会建议您将两个表连接在一起,每个窗口小部件都有一行(可以有多个列,用于类别平均值),并管理C#端设计的显示方面

1

首先 - 如评论中所述 - 如果您有一个字段可以按顺序排列,你可以使用一个选择和联合并排序。,你就完成了。

即使没有(在每个查询不同的排序)是STIL可能(假设这两个查询具有完全相同的架构):

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY ColA) OrderA,1 OrderB,* 
     FROM A 
     UNION ALL 
     SELECT ROW_NUMBER() OVER (ORDER BY ColB) + 1 OrderA,2 OrderB, * 
     FROM B) C 
ORDER BY OrderA, OrderB 

免责声明 - 我不认为这是一个数据库操作。

-1

我个人并不知道C#,所以我不知道在应用程序中做这种事会有多么困难/容易,但正如一方认为的那样,一种方法可能能够在SQL查询,而不必进行两个单独的查询和备用显示以及所有...一个选项可能只是执行连接并将结果并排显示。我的意思是,你可以沿着线做一些事情:

SELECT Widget.Name, Widget.Category, Widget.Speed, Category.Speed AS AvgSpeed 
FROM Widget 
INNER JOIN Category 
ON Widget.Category=Category.Name; 

然后,你最终会具有沿的

Name Category Speed AvgSpeed 
W1 Sample 1ms 2ms 
0

行的表的东西,如果你有标识列两个临时表,您可以选择这两个表的联合行号的谨慎操作:

declare @linesA table 
(
    lineid int identity(1,1) primary key clustered, 
    line varchar(80) 
) 

declare @linesB table 
(
    lineid int identity(1,1) primary key clustered, 
    line varchar(80) 
) 

insert into @linesA (line) 
select 'A - 1' 
union select 'A - 2' 
union select 'A - 3' 

insert into @linesB (line) 
select 'B - 1' 
union select 'B - 2' 
union select 'B - 3' 

select 
    lineid * 2 as RowNum, 
    line from @linesA 
union select 
    lineid * 2 + 1 as RowNum, 
    line from @linesB 
order by RowNum 

如果没有标识列,然后创建一个与ROW_NUMBER()这样的:

select 
    row_number() over (order by line) * 2 as RowNum, 
    line from @linesA 
union select 
    (row_number() over (order by line) * 2) + 1 as RowNum, 
    line from @linesB 
order by RowNum 
0

更新的评论。

第一CTE是只产生单双号

记得,在默认情况下最大允许递归的是100

所以我们在第一台设置@I的值的记录数。

也注意到“OPTION(MAXRECURSION 0);”如果记录数大于100,那么这是必需的,在这种情况下,递归会发生多次。

 DECLARE @widget TABLE 
     (
      widgetID  INT 
      ,widgetName  sysname 
      ,WidgetType  sysname 
     ) 

     DECLARE @categoryAvg TABLE 
     (
      WidgetType  sysname 
      ,categoryAvg sysname 
     ) 

     INSERT INTO @widget(widgetID, widgetName,WidgetType) 
     SELECT 1,'widget1','Wtype1' 
     UNION ALL SELECT 2,'widget2','Wtype1' 
     UNION ALL SELECT 2,'widget3','Wtype2' 
     UNION ALL SELECT 2,'widget4','Wtype2' 

     INSERT INTO @categoryAvg(WidgetType, categoryAvg) 
     SELECT 'Wtype1',10 UNION ALL SELECT 'Wtype2',20 


    declare @i int=100--MAX 100 ByDefault 
    declare @StartOdd int=1 --To generate ODD numbers 
    declare @StartEven int=2 --To generate EVEN numbers 
    SELECT @i = COUNT(*) From @widget 

    ;WITH CTE_OE(Rowid,OddNum,EvenNum) 
    as 
    (
     select 1,@StartOdd,@StartEven 
     union all 
     select t1.rowid+1,t1.OddNum+2,t1.EvenNum+2 
     from CTE_OE t1 
     where t1.rowid<@i 
    ), 
    CTE_1(WidgetType,OutputColumn,RowID) 
    AS 
    (
     SELECT t1.WidgetType,t1.OutputColumn,t2.OddNum 
     FROM 
     (
      SELECT WidgetType 
        ,widgetName As OutputColumn 
        ,ROW_NUMBER() OVER (ORDER BY widgetName,WidgetType) RowID 
      FROM @widget 
     )t1 
     JOIN CTE_OE t2 
      ON t1.RowID=t2.Rowid 
    ), 
    CTE_2(OutputColumn,RowID) 
    AS 
    (
     Select t1.OutputColumn 
       ,t2.EvenNum 
     From 
     (
      SELECT 'Type'+ ' = ' + q1.WidgetType + ', Avg = ' + q1.categoryAvg As OutputColumn 
        ,ROW_NUMBER() OVER (ORDER BY q1.WidgetType) AS RowID 
      FROM @categoryAvg q1 
      JOIN CTE_1 q2 
       on q1.WidgetType=q2.WidgetType 
     )t1 
     JOIN CTE_OE t2 
      ON t1.RowID=t2.Rowid  

    ) 
    Select OutputColumn 
    From 
    (
     Select OutputColumn,RowID from CTE_1 
     union all 
     select OutputColumn,RowID from CTE_2 
    )qry 
    order by RowID 
    OPTION (MAXRECURSION 0); 

enter image description here

+0

从输出来判断,这或多或少是我要做的。我在w.widgettype = c.widgettype上链接这些表。这个解决方案是否与我的窗口小部件基于类型的平均值匹配? –

+0

如果Table之间的链接是widgettype,那么在输出中应该有widgettype而不是widgetName。因为一个或多个小部件可能有相同的小部件类型。如果每个相同类型的小部件在其下面显示相同的categoryAvg,那么可以吗?如果它不正确,并且您仍然需要输出widgetName,则需要提供更多信息,例如每个类型有多少个小部件。如果该信息存储在某个地方,则可以应用“加权平均”或其他一些计算方法。 –

+0

我已经更新了代码,假设您想看到相同类型的每个窗口小部件的相同平均值。 –