我们有一个包含以下数据的表ta_service
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数据库。任何帮助表示赞赏
答案 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
需要超出子查询。
•子查询无法在内部操纵其结果,也就是说,子查询不能包含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,另一个答案也是正确的。我已发表评论,但我的帐户不允许。