12

UNION ALL私は1で結合されている2つのクエリを持っています:

--Query 1
SELECT Flavor, Color
FROM Friends

 

--Query 2
SELECT Flavor,
    (SELECT TOP 1 Color
     FROM Rainbows
     WHERE Rainbows.StrangerID = Strangers.StrangerID
     ORDER BY Wavelength DESC
    ) AS Color
FROM Strangers

もちろん、どちらも別々にうまく動作しますが、 と組み合わせるとUNION ALL:

SELECT Flavor, Color
FROM Friends

UNION ALL

SELECT Flavor,
    (SELECT TOP 1 Color
     FROM Rainbows
     WHERE Rainbows.StrangerID = Strangers.StrangerID
     ORDER BY Wavelength DESC
    ) AS Color
FROM Strangers

クエリは次のエラーで失敗します。

メッセージ 104、レベル 15、状態 1、行 3
ORDER BY 項目は、ステートメントに UNION 演算子が含まれている場合、選択リストに表示する必要があります。

UNION ALL を含むステートメントで ORDER BY を使用するにはどうすればよいですか?

コピー&ペースト可能な例

CREATE TABLE Friends (Flavor int, Color int)
CREATE TABLE Strangers (Flavor int, StrangerID int)
CREATE TABLE Rainbows (StrangerID int, Color int, Wavelength int)
go

SELECT Flavor, Color
FROM Friends

UNION ALL

SELECT Flavor,
    (SELECT TOP 1 Color
     FROM Rainbows
     WHERE Rainbows.StrangerID = Strangers.StrangerID
     ORDER BY Wavelength DESC
    ) AS Color
FROM Strangers
go

DROP TABLE Rainbows
DROP TABLE Strangers
DROP TABLE Friends

サーバー: メッセージ 104、レベル 15、状態 1、行 2
ステートメントに UNION 演算子が含まれている場合、ORDER BY アイテムは選択リストに表示される必要があります。

脚注

  • 1架空の例。か否か。

こちらもご覧ください

4

4 に答える 4

6

ちょっとしたハックですが、これでうまくいきます。

CREATE TABLE Friends (Flavor int, Color int)
CREATE TABLE Strangers (Flavor int, StrangerID int)
CREATE TABLE Rainbows (StrangerID int, Color int, Wavelength int)
go

SELECT Flavor, Color
FROM Friends

UNION ALL

SELECT Flavor,
    (SELECT Color FROM 
        (SELECT TOP 1 Color, Wavelength
         FROM Rainbows
         WHERE Rainbows.StrangerID = Strangers.StrangerID
         ORDER BY Wavelength DESC
         ) AS Foo
    ) AS Color
FROM Strangers
go

DROP TABLE Rainbows
DROP TABLE Strangers
DROP TABLE Friends
于 2010-09-10T15:08:35.577 に答える
1

CTE(Common Table Expression)を使用できることを知っています。ここでは、CTEの注文を使用できます。

;with results as
(

    SELECT Cassettes.CassetteNumber,
    LastCassetteTransfers.Amount,
    CassetteTransfers.CreatedDate
    FROM Cassettes
    INNER JOIN LastCassetteTransfers
    ON Cassettes.CassetteGUID = LastCassetteTransfers.CassetteGUID

    UNION ALL

    SELECT Cassettes.CassetteNumber,
    (
       SELECT TOP 1 CassetteTransfers.Amount
       FROM CassetteTransfers
       WHERE CassetteTransfers.CassetteGUID = Cassettes.CassetteGUID
       AND CassetteTransfers.Mode = 'ctmLoad'
    ) AS Amount,
    CassetteTransfers.CreatedDate
    FROM Cassettes

)

SELECT CassetNumber, Amount
FROM results
ORDER BY CassetteTransfers.CreatedDate DESC, CassetteTransfers.Amount

それは役立つはずです。重要なのは、内部クエリ(この場合はCTE)で返される列による順序を確認することです。

それがどのように機能するか教えてください。

于 2010-09-10T14:53:56.543 に答える
1

実際、私がコメントしたリンクの回避策を見て、これを試してみてください:

SELECT Flavor, Color
FROM Friends

UNION ALL

SELECT Flavor,
(SELECT TOP 1 Color FROM 
    (SELECT Color, Wavelength
    FROM Rainbows
    WHERE Rainbows.StrangerID = Strangers.StrangerID
) X ORDER BY Wavelength DESC) AS Color
FROM Strangers

...または、エンジンをだまして文句を言わないようにするための同様のタイプのもの。

しかし、残念ながらテストすることはできません。仮想であろうとなかろうと、建物に2000ボックスが残っているとは思いません。

編集:ああ!ジョーと私は私たちの卑劣さで重なったようです:)

于 2010-09-10T15:19:07.440 に答える