SQL Server:Subquery with Subqueryで注文します
-
02-10-2019 - |
質問
2つのクエリが組み合わされています UNION ALL
1:
--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
クエリはエラーで失敗します:
MSG 104、レベル15、状態1、行3
ステートメントに組合オペレーターが含まれている場合、アイテムによる注文は、選択リストに表示する必要があります。
組合全員との声明で注文を使用するにはどうすればよいですか?
コピー患者の例
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
サーバー:MSG 104、レベル15、状態1、行2
ステートメントに組合オペレーターが含まれている場合、アイテムによる注文は、選択リストに表示する必要があります。
脚注
- 1考慮された仮説的な例。か否か。
参照してください
解決
ちょっとしたハックですが、これはうまくいきます。
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
他のヒント
CTE(一般的なテーブル式)を使用できることを知っています。ここでは、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
それは助けになるはずです。重要なThigは、内部クエリ(この場合はCTE)で列ごとに返されるようにすることです。
それがどのように機能するか教えてください。
実際、私がコメントしたリンクからの回避策を見ると、これを試してみたいと思うかもしれません。
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箱が残っているとは思わない。
編集:ああ!ジョーと私は私たちの卑劣さに重なり合っているように見えます:)
所属していません StackOverflow