2013-04-12 3 views
0

У меня возникли проблемы с записью запроса в PL/SQL. Я точно знаю, как это сделать в SQL Server T-SQL, я просто не так хорош с Oracle.SQL Server T-SQL для преобразования Oracle PL/SQL

Это должна быть строка 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 

Спасибо за помощь!

+0

Хм так зачем голосовать и голосовать за закрытие? Это настоящая проблема. – CompanyDroneFromSector7G

ответ

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; 
+0

Спасибо - есть ли способ сделать это, не используя курсор? – CompanyDroneFromSector7G

1

Используйте подзапросы (то, что вы mauy знаете, как общие табличные выражения), чтобы получить два значения:

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 

Я предполагаю, что в реальной жизни значения передаются в качестве переменных или параметров, а не будучи жестко закодированным, как в вашем примере.

+0

Ценности жестко закодированы - это для одного из многих бизнес-правил. Это выглядит хорошо, я дам ему поход в понедельник - спасибо! – CompanyDroneFromSector7G

Смежные вопросы