两个SQL查询的交替结果

时间:2013-10-16 17:35:47

标签: sql sql-server-2012

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

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

很抱歉,如果这令人困惑,我可以澄清是否需要。我只是想让最终的应用程序在C#中显示非常简单。在实际应用中可能会更容易,但我对C#不太熟悉......

5 个答案:

答案 0 :(得分:1)

首先 - 正如评论中所述 - 如果您有一个要订购的字段,您可以使用一个带工会的选择并按顺序排序。,您就完成了。

即使不是(每个查询的顺序不同),它仍然可能(假设两个查询具有完全相同的模式):

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 :(得分:0)

这可以使用两个表变量,每个表中有两个排序列和一个union all,但我建议你将两个表连接在一起,每个小部件有一行(可以有多个列用于类别平均值)和在C#端管理设计的显示方面

答案 2 :(得分:0)

如果您有两个带有标识列的临时表,则可以通过仔细操作行号来选择两个表的UNION:

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

答案 3 :(得分:0)

在评论中更新。

第一个CTE只生成奇数和偶数

请记住,默认情况下,max allowed recursion为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

答案 4 :(得分:-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