我有一个这样的SQL语句:
//conditional winner checker
char winner() {
if (board[0][0] == board[0][1] && board[0][1] == board[0][2])
return board[0][0];
if (board[1][0] == board[1][1] && board[1][1] == board[1][2])
return board[1][0];
if (board[2][0] == board[2][1] && board[2][1] ==board[2][2]))
return board[2][0];
if (board[0][0] == board[1][0] && board[1][0] == board[2][0])
return board[0][0] ;
if (board[0][1] == board[1][1] && board[1][1] == board[2][1])
return board[0][1];
if (board[0][2] == board[1][2] && board[1][2] == board[2][2])
return board[0][2];
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
return board[2][0];
}
此查询的结果正确。但是,如果我更改SELECT
y.ID, y.STATUS, y.CONTROLID, y.TRCDE,
y.GST_ABSORB, y.RCODE, y.ORDNO,
CONVERT(VARCHAR(10), y.TRDATE, 103) AS TRDATE, y.DLYDATE,
y.SHPTO, y.COMNO, y.COMNO2, y.TERR, Y.CLASS,
y.PRDATE, y.PRNO, y.JOBNO, y.GITNO, y.DONO, y.INVNO,
y.OFFSETNO, y.COSTYPE, y.BATCH20, y.DUPPROD, y.PROD2, v.COMNM
FROM
YTDTRNI AS y
LEFT JOIN
VND AS v ON y.COMNO = v.COMNO
ORDER BY
y.TRDATE DESC
子句,使其不包含表的别名,则如下所示:
ORDER BY
结果SELECT y.ID,
y.STATUS,
y.CONTROLID,
y.TRCDE,
y.GST_ABSORB,
y.RCODE,
y.ORDNO,
CONVERT(varchar(10),y.TRDATE,103) AS TRDATE,
y.DLYDATE,
y.SHPTO,
y.COMNO,
y.COMNO2,
y.TERR,
Y.CLASS,
y.PRDATE,
y.PRNO,
y.JOBNO,
y.GITNO,
y.DONO,
y.INVNO,
y.OFFSETNO,
y.COSTYPE,
y.BATCH20,
y.DUPPROD,
y.PROD2,
v.COMNM
FROM YTDTRNI AS y LEFT JOIN
VND AS v ON y.COMNO = v.COMNO
ORDER BY TRDATE DESC
列的顺序变得混乱。
它将显示结果,其中TRDATE
依次显示:
TRDATE
是否由于使用别名或convert函数而出现问题?
答案 0 :(得分:2)
在提供合格字段名称(y.TRDATE
)的第一个查询中,结果按TRDATE
表中的实际YTDTRNI
值进行排序-我认为,是某种日期字段(date
,datetime
,datetime2
或类似的日期字段)。在这种情况下,日期排序规则适用,您将获得预期的排序结果。
在第二个查询中,您按派生的TRDATE
值进行排序,该值作为结果集的一部分返回,即varchar(10)
-因此适用字符串(而不是日期)排序规则。 / p>
答案 1 :(得分:1)
您已将CONVERT
的结果别名为TRDATE
-因此TRDATE
和y.TRDATE
指的是不同的东西:
CONVERT(varchar(10),y.TRDATE,103) AS TRDATE
当您通过TRDATE
进行订购时,您将根据此转换的结果进行订购。但是,当您按y.TRDATE
订购时,您是按YTDTRNI
表中的原始列进行订购。
为了维护良好的代码,您可能希望更改转换结果的别名,以便在有人需要维护此别名时,很明显发生了什么。