这可能是不可能的,但有没有办法在表格上以交替的行输出两个查询的结果?
例如,如果我有两个表试图显示一个小部件与其类别中的所有小部件,我会输出每个小部件后跟类别平均值,然后是小部件2,其下一行的类别平均值。这将导致4行。这都是假设窗口小部件及其类别平均值在两个单独的表中。
很抱歉,如果这令人困惑,我可以澄清是否需要。我只是想让最终的应用程序在C#中显示非常简单。在实际应用中可能会更容易,但我对C#不太熟悉......
答案 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);
答案 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