这可能是不可能的,但是有没有办法在表上以交替行输出两个查询的结果?
例如,如果我有两个表试图显示一个小部件与其类别中的所有小部件,我将输出每个小部件,然后是类别平均值,然后是小部件 2,其类别平均值在下一行。这将导致 4 行。这一切都假设小部件及其类别平均值位于两个单独的表中。
抱歉,如果这令人困惑,我可以澄清是否需要。我只是想让最终应用程序在 C# 中显示变得非常简单。在实际应用程序中可能更容易做到,但我对 C# 不是很熟悉......
这可能是不可能的,但是有没有办法在表上以交替行输出两个查询的结果?
例如,如果我有两个表试图显示一个小部件与其类别中的所有小部件,我将输出每个小部件,然后是类别平均值,然后是小部件 2,其类别平均值在下一行。这将导致 4 行。这一切都假设小部件及其类别平均值位于两个单独的表中。
抱歉,如果这令人困惑,我可以澄清是否需要。我只是想让最终应用程序在 C# 中显示变得非常简单。在实际应用程序中可能更容易做到,但我对 C# 不是很熟悉......
首先 - 正如评论中所说 -如果您有一个要订购的字段,您可以使用一个带有 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
免责声明 - 我认为这不是数据库操作。
这可以使用两个表变量,每个中的两个排序列和一个联合所有,但我建议您将两个表连接在一起,每个小部件有一行(可以有很多列,一个用于类别平均值)并管理显示C# 方面的设计方面
如评论中所更新。
第一个 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);
如果您有两个带有标识列的临时表,则可以通过仔细操作行号来选择两个表的 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
我个人不了解 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