首页 > 解决方案 > 将 SQL Server 中的子选择查询转换为 DB2 语法 Order By Clause

问题描述

目前,我正在尝试处理一个查询,并试图找出一种方法来使用 DB2 中的 Order By 子句,该子句不起作用但当前在 SQL Server 中运行时针对 DBMS 运行。SQL Server 语法如下,查询是子查询而不是连接。我已经尝试了不同的方法来转换数据,因此它可以通过将表连接在一起来提取 DB2 语法中的结果集,同时使用 Order By Clause 修补这些表。目标是尝试按升序(从小到大)对 boxNumber 列进行排序。我能否就如何成功提取结果集而不收到非 -104 或 -206 的 SQL 错误代码获得一些建议?SQL Server 和 DB2 语法在 Order By 子句方面是否存在一定的限制差异?

SQL 服务器:

SELECT *, (SELECT boxNumber FROM PRODUCTS WHERE ORDER.orderId =orderId) AS boxNumber
FROM ORDER
WHERE ((istask = 0 AND historyflag= 0) AND
(orderId IN (SELECT orderId
           FROM PRODUCTS
           WHERE ORDER.orderId = orderId AND [STATUS] = 'AVAIL' OR [STATUS]='INSTOCK')))
ORDER BY (SELECT boxNumber FROM PRODUCTS WHERE ORDER.orderId =orderId);

下面是我尝试运行的 DB2 中的一些代码示例: 示例 1:

SELECT *, (SELECT boxNumber FROM PRODUCTS WHERE ORDER.orderId =orderId) AS boxNumber
FROM ORDER
WHERE ((istask = 0 AND historyflag= 0) AND
(orderId IN (SELECT orderId
           FROM PRODUCTS
           WHERE ORDER.orderId = orderId AND STATUS = 'AVAIL' OR STATUS='INSTOCK')))
ORDER BY boxNumber;

示例 2:

SELECT *
FROM ORDER
WHERE ((istask = 0 AND historyflag = 0)
AND (orderId IN (SELECT orderId
     FROM PRODUCTS prod LEFT JOIN ORDER ord
     ON prod.orderId = ord.orderId
     WHERE STATUS IN ('AVAIL','INSTOCK') ORDER BY prod.boxNumber)))

示例 3:

SELECT *
FROM ORDER
WHERE ((istask = 0 AND historyflag = 0)
AND (orderId IN (SELECT orderId
FROM PRODUCTS prod LEFT JOIN ORDER ord
ON prod.orderId = ord.orderId
WHERE ORDER.orderId = orderId AND STATUS IN ('AVAIL','INSTOCK') ORDER BY prod.boxNumber)))

标签: sql-serverdatabasedb2data-conversion

解决方案


select * from (
    SELECT *,
            (SELECT boxNumber
         FROM PRODUCTS
         WHERE ORDER.orderId = orderId) AS boxNumber
    FROM ORDER
    WHERE istask = 0 AND historyflag= 0
    AND   orderId IN (SELECT orderId
                      FROM PRODUCTS
              WHERE ORDER.orderId = orderId
              AND STATUS = 'AVAIL' OR STATUS = 'INSTOCK')
) as T
ORDER BY boxNumber;

如果问题确实在ORDER BY子句中,那应该可以解决问题。不应该;AFIAK,该子句应接受任何SELECT列,包括子查询。(将来,请务必在您的问题中包含文字错误消息。回答您问题的人可能会觉得它很有帮助。)

我冒昧地删除了多余的括号和括号引号。不必要的标点符号只会使代码更难阅读。


推荐阅读