0

私はいつもSQLサブクエリに苦労しています。たとえば、この質問への回答:

select userid,
       my_date,
       ...
from
(
select userid,
      my_Date,
      ...
      max(my_date) over (partition by userid) max_my_date
from   users
)
my_date = max_my_date

なぜそれができないのですか?

select userid,
       my_Date,
       ...
       max(my_date) over (partition by userid) max_my_date
from  users
where 
my_date = max_my_date

私はそれが正しくないことを知っていますが、結局のところ、最初の選択は2番目の選択の結果から何かを選択するだけmy_date = max_my_dateです。この種のサブクエリを使用することについて、どのような状況で考える必要がありますか(通常のin、existなど以外)?

4

2 に答える 2

3

WHERE句は(論理的に)前に 処理されるためSELECTです。

処理順序は次のとおりです。

  1. から
  2. オン
  3. アウター
  4. どこ
  5. GROUP BY
  6. CUBE | 巻き上げる
  7. 持っている
  8. 選択する
  9. 明確
  10. 注文者

(ここから盗まれた)

ご覧のとおり、SELECT実際には、可能なフィルタリングおよびグループ化アクティビティが発生した後、プロセスのかなり遅い段階で発生します。したがって、式の結果を句で使用する場合は、サブクエリ(または(以前の)CTE)の一部であるSELECT方がよいでしょう。SELECT

于 2013-02-07T07:38:06.550 に答える
0

max() は SQl の GROUP 関数であり、2 番目のクエリで正しい答えが得られない理由です。

最初のクエリでは、最初に最大値を取得してから、テーブル内の最大値を比較します。

于 2013-02-07T07:32:29.373 に答える