回答

收藏

在WHERE子句中引用列别名

技术问答 技术问答 126 人阅读 | 0 人回复 | 2023-09-13

SELECT logcount, logUserID, maxlogtm/ Y* k8 q$ g1 C; l, p
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff# a) ~. }( z% ^% x3 n% u6 e
FROM statslogsummary& q0 G: d. t  ?6 [' u' T. B9 R! G  Y, r
WHERE daysdiff > 120# [2 Q2 g7 r, w
我懂了+ u% B. S8 O' b& b6 C( S
  Z8 G# ?, }% i
“无效的列名daysdiff”。
& ?" k  T- e2 g( b8 Z$ H
1 H( u4 ]/ Y* w8 t; K! a9 X. s' y
Maxlogtm是日期时间字段。是让我发疯的小东西。
% P8 w$ Y7 i1 Y  B- o8 z& \) H) n& M# B                1 D, \9 E7 m; H0 P5 h
解决方案:0 o  c  C! E. o; T2 \
               
& m7 d+ M( k1 \! D# |
3 e7 f6 y2 x' X( v5 c- @+ b% V2 L" p
                SELECT# z( c' k! i2 K" H# \4 m
   logcount, logUserID, maxlogtm,
: {: j8 s& b9 h; ?* ?   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff( b: C& o5 e: B- W' y# _& e( q
FROM statslogsummary; Z0 b% a) L2 X4 @; h
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
- U0 _( f( j) i% P+ ^通常,您不能在WHERE子句中引用字段别名。(将其视为SELECT包括别名在内的全部内容,在该WHERE子句之后应用。)8 R6 F. p6 z7 w
但是,如其他答案所述,您可以强制将SQL视为SELECT在WHERE子句之前进行处理。通常使用圆括号来强制操作的逻辑顺序,或者使用通用表表达式(CTE)来完成此操作:) X* J$ y; Y' F9 W
括号/子选择:
/ n* m8 w  N& n9 [5 ZSELECT
+ |7 h. ~6 a/ w: Y   *+ T8 [. X5 d/ y) z3 U8 V
FROM0 V) T3 B8 {$ L
(5 l0 p! N' H( N) t5 }" S* v( n- r
   SELECT
0 Z. m4 \! m8 B: J      logcount, logUserID, maxlogtm,. O* \' q) ]& M7 \+ ~7 U2 f
      DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff4 w5 G, f; v  V( O( j
   FROM statslogsummary   3 \) c7 c6 B7 ^
) as innerTable: K4 K0 D; `- s
WHERE daysdiff > 1205 ^8 `+ ^$ N: C" B
或参阅亚当的CTE版本答案。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则