2

これはおそらく不可能ですが、2 つのクエリの結果をテーブルの交互の行に出力する方法はありますか?

たとえば、1 つのウィジェットとそのカテゴリ内のすべてのウィジェットを表示しようとしている 2 つのテーブルがある場合、各ウィジェットの後にカテゴリ平均を出力し、その後にカテゴリ平均を含むウィジェット 2 を次の行に出力します。これにより、4行になります。これはすべて、ウィジェットとそのカテゴリの平均が 2 つの別々のテーブルにあることを前提としています。

わかりにくかったら申し訳ありませんが、必要であれば明確にすることができます。私は、最終的なアプリケーションを C# で表示するのを非常に簡単にしようとしています。おそらく実際のアプリケーションで行う方が簡単でしょうが、私はC#にあまり慣れていません...

4

5 に答える 5

1

最初に-コメントで述べたように-注文するフィールドがある場合は、ユニオンとオーダーバイで1つの選択を使用できます。これで完了です。

そうでない場合でも(各クエリの順序が異なります)、可能です(2つのクエリがまったく同じスキーマを持っていると仮定します):

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

コメントで更新されたとおり。

最初の 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 に答える
-1

私は個人的にC#を知らないので、アプリケーション内でこれを行うのがどれほど難しい/簡単かはわかりません. 2 つの個別のクエリを作成し、表示を交互に行います。オプションとして、結合を実行して結果を並べて表示することもできます。つまり、次のようなことができるということです。

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 に答える