在Sybase DB中使用Union子查询获取语法错误

时间:2014-02-11 16:35:30

标签: sql union sybase

我们有一个包含以下数据的表ta_service

Ref_id seq desc

2340 1服务1
2340 2报价1
2340 3服务2
2340 4报价2
2340 5服务3
2340 5服务4

我们要求提取有优惠的服务,我们没有任何参考可以将此数据与Ref_id(外键)和seq(主键)列分开。

我们尝试通过以下查询获取,但失败了。

SELECT * FROM ta_service
WHERE Ref_id = 2340 AND seq IN ( 
    SELECT seq-1 AS seq
    FROM ta_service
    WHERE Ref_id = 2340
    AND desc LIKE '%Offer%'
UNION 
    SELECT seq AS seq
    FROM ta_service
    WHERE Ref_id = 2340
    AND desc LIKE '%Offer%'
        ORDER BY seq) 

我们正在使用sybase数据库。任何帮助表示赞赏

5 个答案:

答案 0 :(得分:2)

以下是sybase手册的链接,其中说子查询中不支持UNION: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36272.1570/html/commands/X56548.htm

但是我注意到如果我们在派生表表达式中有union子句,那么它可以正常工作。以下是sybase手册的链接,该手册提供了查询的语法: http://infocenter.sybase.com/archive/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug418.htm

下面给出的失败和工作查询示例:

模拟用例:从D1或D2部门获取员工。

查询失败:

SELECT empname from emp WHERE deptid IN 
(SELECT deptid from dept WHERE deptid = "D1"
UNION
SELECT deptid from dept WHERE deptid = "D2")

Working query:  With additional select and derived table based on union:

SELECT empname from emp WHERE deptid IN (
SELECT deptid FROM 
(SELECT deptid from dept WHERE deptid = "D1"
UNION
SELECT deptid from dept WHERE deptid = "D2") derivedTable
)

答案 1 :(得分:1)

假设您正在使用ASE,则ORDER BY需要超出子查询。

来自Sybase Documentation:

  

•子查询无法在内部操纵其结果,也就是说,子查询不能包含order by子句,compute子句或into关键字。

答案 2 :(得分:1)

您应该移除order by,并将desc括在"中,因为它是关键字

SELECT * FROM ta_service
WHERE Ref_id = 2340 
AND seq IN ( 
    SELECT seq-1 AS seq
    FROM ta_service
    WHERE Ref_id = 2340
    AND "desc" LIKE '%Offer%'
UNION 
    SELECT seq AS seq
    FROM ta_service
    WHERE Ref_id = 2340
    AND "desc" LIKE '%Offer%'
    ) 

答案 3 :(得分:0)

ASE不支持任何子查询中的UNION。

您可以参考Sybase Documentation

答案 4 :(得分:0)

ASE不支持子查询中的UNION,因为我刚才提到的12.5 SQL手册证实了这一点。它说“你不能在子查询中包含for的子句或联合。”在第5章第169页上。即使链接是IQ,另一个答案也是正确的。我已发表评论,但我的帐户不允许。