2013-10-16 194 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

我已經更新了代碼,假設您想看到相同類型的每個窗口小部件的相同平均值。 –