SQL Server 到 PL/SQL

Posted

技术标签:

【中文标题】SQL Server 到 PL/SQL【英文标题】:SQL Server to PL/SQL 【发布时间】:2011-03-19 20:13:16 【问题描述】:

这是需要转成Oracle 11g的sql server脚本:

select p.locale, q.everecondis, [0] as No, [1] as Yes, 
[0]* 100.0/([0] + [1]) as [pctNo],
[1]* 100.0/([0] + [1]) as [pctYes]
from
(select p.locale, q.everecondis, s.enr1yr
from s, q, p
where s.student_info_key = q.student_info_key 
and s.pse_school_key = p.pse_school_key and s.enr1yr >=1) as tbl
pivot
(count(enr1yr) for enr1yr in ([0],[1])) as pvt
order by locale, everecondis

如何让它在 Oracle 11g 上的 PL/SQL 中运行? (PL/SQL 新手)

【问题讨论】:

您的(具体)问题是什么? 如何把它转成PL/SQL在Oracle 11g上运行? 尝试在 Oracle 中运行它,并修复任何损坏的地方。两者都是基于 SQL 的,所以基础是一样的。特定于供应商的功能/约定会有所不同。所以只要修复任何不一样的功能。 该查询实际上没有意义。您拥有s.enr1yr >=1,但正在以enr1yr in (0,1)为中心 @chris:请自行评论答案,而不是将 cmets 编辑到您的问题中。您可以评论自己问题的答案; 50 rep 的要求仅适用于其他人的问题和其他人的答案。 【参考方案1】:

该查询似乎没有意义,因为 WHERE 子句中的 s.enr1yr >= 1 不包括您稍后尝试计算的记录,但是应该在 SQL Server 和 Oracle AFAIK 中都可以使用的文字重写是

SELECT p.locale,
       q.everecondis,
       COUNT(CASE WHEN s.enr1yr = 0 THEN 1 END) AS No,
       COUNT(CASE WHEN s.enr1yr = 1 THEN 1 END) AS Yes,
       AVG(CASE WHEN s.enr1yr = 0 THEN 100.0 ELSE 0.0 END) AS [pctNo],
       AVG(CASE WHEN s.enr1yr = 1 THEN 100.0 ELSE 0.0 END) AS [pctYes]
FROM   s
       JOIN q
         ON s.student_info_key = q.student_info_key
       JOIN p
         ON s.pse_school_key = p.pse_school_key
WHERE  s.enr1yr IN (0,1)
GROUP BY p.locale,
         q.everecondis      
ORDER BY p.locale,
         q.everecondis  

我将WHERE 子句更改为s.enr1yr IN (0,1),因为这似乎是迄今为止最可能的所需语义。如果不是这样,请告诉我!

【讨论】:

我认为只是 < 被错误地输入为 >,即 <= 1 AVG 需要ELSE 0.0 @Richard - 是的,当我点击查看您之前的评论时,我注意到了这一点。谢谢!

以上是关于SQL Server 到 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQLPL/SQL过程

Oracle——PL/SQL

oracle(sql)基础篇系列——PLSQL游标存储过程触发器

sql server SQL 调试:无法启动 T-SQL 调试。未能附加到 SQL Server 进程

sql server2008升级到2008 R2出现问题

从Oracle到SQL Server和从SQL Server到Oracle的迁移指南