Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server语句抛出错误代码208_Sql_Sql Server_Oracle - Fatal编程技术网

SQL Server语句抛出错误代码208

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

我正在开发一个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 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文档说了什么?