1

私は自分の問題に対する答えを見つけようとしましたが、同様の例を見つけることができませんでした。

そのようなクエリの結果があります

SELECT * FROM (
   SELECT id FROM table
) AS t1

次に、t1をシフトする必要があるため、t1をそれ自体の別のインスタンスに結合したいと思います。たとえば、行を前の行と比較したい場合です。私は試した:

SELECT * FROM (
   SELECT id FROM table
) AS t1
LEFT JOIN t1 AS t2 ON (my conditions)

しかし、t1が無効なオブジェクト名であるというエラーが表示されます。selectステートメントをコピーすると:

SELECT * FROM (
   SELECT id FROM table
) AS t1
LEFT JOIN (
   SELECT id FROM table
) AS t2 ON (my conditions)

上記は機能しますが、すでに返された結果に参加するよりも遅くはありませんか?

どんな助けでもいただければ幸いです

4

2 に答える 2

3

最初のものは正しいです:

SELECT * FROM (
   SELECT id FROM table
) AS t1
LEFT JOIN t1 AS t2 ON (my conditions)

エイリアスをエイリアスできないためです。次のように CTE を使用して、同様のことを行うことができます。

;WITH cte
AS
(
    SELECT * FROM Table   
)
SELECT *
FROM Cte t1
INNER JOIN cte t2 ON --
于 2012-10-03T11:07:46.263 に答える
3

あなたの選択は次の形式でなければならないと思います:

SELECT * 
FROM [table] t1
LEFT JOIN [table] t2 ON (your conditions)

パフォーマンスの観点からは、これは最後の選択とMahmoud の回答の CTE ソリューションと同じです(SQL Server で 3 つすべての実行計画を確認しました)。

好みの問題かもしれませんが、このフォームの方が読みやすく、保守しやすいと思います。

于 2012-10-03T11:14:53.920 に答える