SQL Server语句抛出错误代码208
我正在开发一个SQL查询,它与Oracle SQL和SQLServer兼容。我有以下可用的Oracle SQL代码,它生成了Visa购买产品的前15名消费者:SQL Server语句抛出错误代码208,sql,sql-server,oracle,Sql,Sql Server,Oracle,我正在开发一个SQL查询,它与Oracle SQL和SQLServer兼容。我有以下可用的Oracle SQL代码,它生成了Visa购买产品的前15名消费者: SELECT ddo.code as "Data Owner", ROUND((count(ffp.id) / (select count(ffp2.id) from Payments_Table ffp2 join PAY_CHARACTERISTICS dmc2 on ffp2.characteristics_id = dmc2.id
SELECT ddo.code as "Data Owner", ROUND((count(ffp.id) / (select count(ffp2.id) from Payments_Table ffp2 join PAY_CHARACTERISTICS dmc2 on ffp2.characteristics_id = dmc2.id where dmc2.visa_flag = 1) * 100),2) as "% UP"
FROM Customer_Table ddo
JOIN Payment_Table ffp ON ddo.id = ffp.data_owner_id
JOIN PAY_CHARACTERISTICS dpc ON ffp.characteristics_id = dpc.id
WHERE dpc.visa_flag = 1
GROUP BY ddo.code
ORDER BY count(ffp.id) desc
OFFSET 0 ROWS
FETCH FIRST 15 ROWS ONLY;
当我编译这篇文章时,Oracle SQL生成了一个正确的前15名。
但是SQLServer引发以下异常:
错误:无效的对象名称“DIM\u数据\u所有者”。SQLState:S0002
错误代码:208
所以这个查询有点问题。我需要对其进行修改,使其能够在SQLServer上工作,并且仍然能够在Oracle上工作。有什么帮助吗?正如错误所说,您不能在内部查询中使用order by。它只能应用于整个结果集
with x as
(SELECT ddo.code as "Customer", count(ffp.id) as cntffp,
ROUND((count(ffp.id) / (select count(ffp2.id) from PAYMENTS_TABLE ffp2
join PAY_CHARACTERISTICS dmc2 on ffp2.characteristics_id = dmc2.id
where dmc2.VISA_FLAG = 1) * 100),2) as "% UP"
FROM CUSTOMERS_TABLE ddo
JOIN PAYMENTS_TABLE ffp ON ddo.id = ffp.data_owner_id
JOIN PAY_CHARACTERISTICS dpc ON ffp.characteristics_id = dpc.id
WHERE dpc.bulked_flag = 'N'
GROUP BY ddo.code)
, y as (select *, row_number() over(order by cntffp desc) as rn from x)
select Customer, "% Up" from y
where rn <= 15
也许现在ANSI SQL的FETCH第一次可以与Oracle和SQL Server一起使用
SELECT ddo.code as "Customer", ROUND((count(ffp.id) / (select count(ffp2.id) from PAYMENTS_TABLE ffp2 join PAY_CHARACTERISTICS dmc2 on ffp2.characteristics_id = dmc2.id where dmc2.VISA_FLAG = 1) * 100),2) as "% UP"
FROM CUSTOMERS_TABLE ddo
JOIN PAYMENTS_TABLE ffp ON ddo.id = ffp.data_owner_id
JOIN PAY_CHARACTERISTICS dpc ON ffp.characteristics_id = dpc.id
WHERE dpc.bulked_flag = 'N'
GROUP BY ddo.code
ORDER BY count(ffp.id) desc
FETCH FIRST 15 ROWS ONLY
信息非常清楚。如果要使用ORDER BY移出内部select,则需要使用TOP in子查询。确实,Stanislovakas,TOP不适用于oracle。它必须与oracle和SQL Server兼容?请在ORDERBY子句之后尝试ANSI SQL的FETCH前15行。较新的Oracle有它,可能也有较新的SQL Server。SQL Server没有rownum Column此功能在Oracle中有效,但在mssql中我遇到以下错误:错误:FETCH语句中第一个选项的使用无效。SQLState:S0002错误代码:153哪个SQL Server版本?我使用了sqljdbc 4.4.0SQL Server 2012或2014中的jar,我认为这是必需的。奇怪的是,您的SQL Server文档说了什么?