将MS ACCESS查询转换为SQL Server查询

时间:2012-03-01 11:59:02

标签: sql-server ms-access porting

我有以下访问查询,我需要在mssql中运行:

SELECT
    [PUB_op-mstr].[om-job], 
    Last([PUB_op-mstr].[om-emp]) AS [LastOfom-emp], 
    Max([PUB_op-mstr].[om-dt-end]) AS [MaxOfom-dt-end], 
    [PUB_op-mstr].[om-wkctr]

FROM
    PUB_wc_mstr INNER JOIN [PUB_op-mstr]
    ON
    PUB_wc_mstr.wc_wkctr = [PUB_op-mstr].[om-wkctr]
GROUP BY 
    [PUB_op-mstr].[om-job],
    [PUB_op-mstr].[om-wkctr], 
    PUB_wc_mstr.wc_dept 
HAVING
    (((Max([PUB_op-mstr].[om-dt-end]))>=Date()-7 
    And 
    (Max([PUB_op-mstr].[om-dt-end]))<Date()) 
    AND ((PUB_wc_mstr.wc_dept)="633" Or (PUB_wc_mstr.wc_dept)="646"));

3 个答案:

答案 0 :(得分:1)

MS SQL不支持LAST聚合函数。所以,你可以用Min / Max替换它。或者您已经编写了自己的SELECT喜欢

[LastOfom-emp] = (SELECT ...

答案 1 :(得分:1)

Access中的

LAST()给出了您正在查找的列的最后一个元素。 示例:T1有一列c1,其中包含:

one
two
three

声明:

SELECT LAST(c1) FROM T1

给出:三个

将此函数移植到SQL Server是可行的,但只有在表中存在(至少)一个已排序列时才可以。要获取列的最后一个元素,您必须执行以下操作:

SELECT TOP(1) c1 FROM T1 ORDER BY c1 DESC;

这会给你错误的结果,即“两个”(因为列没有排序)。因此,要在这种情况下找到正确答案,您需要另一列,例如递增ID

c1     c2
one    1
two    2
three  3

现在你可以:

SELECT TOP(1) c1 FROM T1 ORDER BY c2 DESC;

由于c2已排序,您现在可以得到结果“三”。

答案 2 :(得分:1)

假设Last([PUB_op-mstr].[om-emp])是最大om-emp的{​​{1}}值,请尝试:

om-dt-end