左加入和排序

时间:2018-07-02 03:21:51

标签: sql sql-server

我有一个这样的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函数而出现问题?

2 个答案:

答案 0 :(得分:2)

在提供合格字段名称(y.TRDATE)的第一个查询中,结果按TRDATE表中的实际YTDTRNI值进行排序-我认为,是某种日期字段(datedatetimedatetime2或类似的日期字段)。在这种情况下,日期排序规则适用,您将获得预期的排序结果。

在第二个查询中,您按派生的TRDATE值进行排序,该值作为结果集的一部分返回,即varchar(10)-因此适用字符串(而不是日期)排序规则。 / p>

答案 1 :(得分:1)

您已将CONVERT的结果别名为TRDATE-因此TRDATEy.TRDATE指的是不同的东西:

CONVERT(varchar(10),y.TRDATE,103) AS TRDATE

当您通过TRDATE进行订购时,您将根据此转换的结果进行订购。但是,当您按y.TRDATE订购时,您是按YTDTRNI表中的原始列进行订购。

为了维护良好的代码,您可能希望更改转换结果的别名,以便在有人需要维护此别名时,很明显发生了什么。