2

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

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

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

4

5 回答 5

1

首先 - 正如评论中所说 -如果您有一个要订购的字段,您可以使用一个带有 union 和 order by 的选择。你就完成了。

即使不是(每个查询的顺序不同),它仍然是可能的(假设两个查询具有相同的确切架构):

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 

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

于 2013-10-16T17:44:32.880 回答
0

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

于 2013-10-16T17:43:34.177 回答
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);

在此处输入图像描述

于 2013-10-16T18:39:29.170 回答
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
于 2013-10-16T18:13:24.257 回答
-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
于 2013-10-16T17:46:54.823 回答