SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
私は得る
「無効な列名daysdiff」。
Maxlogtmは日時フィールドです。それは私を夢中にさせる小さなものです。
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
通常、WHERE
句でフィールドエイリアスを参照することはできません。 (エイリアスを含むSELECT
全体がWHERE
句の後に適用されると考えてください。)
しかし、他の回答で述べたように、SQLがSELECT
句の前にWHERE
を処理するように強制することができます。これは通常、操作の論理的な順序を強制するために括弧で、または共通テーブル式(CTE)で行われます。
括弧/副選択:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
または、同じのCTEバージョンに関するAdamの回答を参照してください。
WHERE
句でエイリアスを使用する場合は、サブセレクトまたは CTE でエイリアスをラップする必要があります。
WITH LogDateDiff AS
(
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120
すべての列をCTEにリストしたくない場合、これを行う別の方法は outer apply
を使用することです。
select
s.logcount, s.logUserID, s.maxlogtm,
a.daysdiff
from statslogsummary as s
outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120
コードを繰り返さずにそれを行う最も効果的な方法は、の代わりにを使用してを使用することです。
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
サブクエリを使用してはどうですか(Mysqlでこれが機能しました)。
SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
HAVINGは、ドキュメントに従ってMySQLで機能します。
WHEREキーワードを集計関数で使用できないため、HAVING句がSQLに追加されました。
列のエイリアスを参照できますが、CROSS/OUTER APPLY
を使用して定義する必要があります。
SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;
長所:
WHERE/GROUP BY/ORDER BY
で参照する可能性