SQL Server T-SQL到Oracle PL / SQL的转换

时间:2013-04-12 11:54:52

标签: oracle plsql

我在PL / SQL中编写查询时遇到问题。 我确切地知道如何在SQL Server T-SQL中执行此操作,我对Oracle不太满意。

它必须是一串SQL,而不是一个过程。

以下是我需要的查询类型。这不是实际的查询,但看到这个翻译应该给我我需要的东西。

您可以看到第一个查询是第二个查询的子集,如果它占基础数据的5%以上,则会返回结果。

考虑到这一点,如果有更好的方式来写它,我也会对此感兴趣!

DECLARE @x int
SELECT @x = COUNT(*) * 20
FROM table1
WHERE table1.a=1
AND table1.b=2
AND table1.c=3

DECLARE @y int
SELECT @y = COUNT(*)
FROM table1
WHERE table1.a=1
AND table1.b=2

If @x > @y
    SELECT *
    FROM table1
    WHERE table1.a=1
    AND table1.b=2
    AND table1.c=3

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这可以提供帮助。

DECLARE 
  rate NUMBER(2,1);
  output SYS_REFCURSOR;
BEGIN

SELECT SUM(CASE WHEN c=3 THEN 1 ELSE 0 END ) / COUNT(*)
INTO rate
FROM table1
WHERE table1.a=1
      AND table1.b=2;

  IF (rate > 0.5) THEN
    OPEN output FOR
      SELECT *
      FROM table1
      WHERE table1.a=1
            AND table1.b=2
            AND table1.c=3
  END IF;
END;

答案 1 :(得分:1)

使用子查询(您熟悉的常见表表达式)来获取两个值:

with x_data as (SELECT  COUNT(*) * 20 x
        FROM table1
        WHERE table1.a=1
        AND table1.b=2
        AND table1.c=3 )
, y_data as (SELECT COUNT(*) y
         FROM table1
         WHERE table1.a=1
         AND table1.b=2
    SELECT table1.*
    FROM table1
          , y_data
          , x_data
    WHERE x > y
    and table1.a=1
    AND table1.b=2
    AND table1.c=3

我假设在现实生活中,值是作为变量或参数传递的,而不是像在您的示例中那样进行硬编码。