Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
Уважаемый LR предложил остроумный способ динамической сегментации на сервере. Он нормально работает на MS SQL.
Но когда попробовал на ORACLE - совсем другие результаты.

Итак, MS SQL
with tt as (
select 0 as st ,    35.853 as finish,    1 as weight union all
select 35.853,    18265.49,    10  union all
select 18265.487,    18267.474,    1  union all
select 18267.474,    19661.324,    10  union all
select 19661.324,    19670.246,    1  union all
select 19670.246,    19728.048,    10  union all
select 19728.048,    19739.708,    1  union all
select 19739.708,    22528.106,    10  union all
select 22528.106,    22530.145,    1  union all
select 22530.145,    29864.117,    10  union all
select 29864.117,    29866.117,    1  union all
select 29866.117,    70695.245,    10  union all
select 70695.245,    70697.306,    1  union all
select 70697.306,    96866.3,    10  union all
select 96866.303,    96906.59,    1  union all
select 24675.6,    26656.2,    8  union all
select 35462.84,    35462.85,    3  union all
select 53701.851,    53701.86,    3  union all
select 53702.071,    53702.08,    3 
),
cte as (
select p.x, p.leftweight + ISNULL(sum(t.weight),0) as leftweight, 
       p.rightweight + ISNULL(sum(t.weight),0) as rightweight, 
       row_number() over (order by p.x) as ord 
from (
    select v.x, sum(v.lweight) leftweight, sum(v.rweight) rightweight from (
        select st x, 0 as lweight, weight rweight from tt union all
        select finish, weight, 0 from tt
    ) v group by v.x
) p left join tt t on p.x > t.st and p.x < t.finish 
group by p.x, p.leftweight, p.rightweight
)
SELECT  ISNULL(e2.x, 0) Start, e1.x Finish, e2.leftweight, e2.rightweight
FROM cte e1 left join cte e2 on e1.ord-1=e2.ord
Where e1.x>e2.x


Результат MS SQL (считаю правильный):
startfinishleftweightrightweight
0.000 35.85301
35.85318265.487110
18265.48718265.4901011
18265.49018267.474111
18267.47419661.324110
19661.32419670.246101
19670.24619728.048110
19728.04819739.708101
19739.70822528.106110
22528.10622530.145101
22530.14524675.600110
24675.60026656.2001018
26656.20029864.1171810
29864.11729866.117101
29866.11735462.840110
35462.84035462.8501013
35462.85053701.8511310
53701.85153701.8601013
53701.86053702.0711310
53702.07153702.0801013
53702.08070695.2451310
70695.24570697.306101
70697.30696866.300110
96866.30096866.303100
96866.30396906.59001


Вот ORACLE
with tt as (
select 0 as st ,    35.853 as finish,    1 as weight FROM  DUAL union all
select 35.853,    18265.49,    10 FROM  DUAL  union all
select 18265.487,    18267.474,    1 FROM  DUAL  union all
select 18267.474,    19661.324,    10 FROM  DUAL  union all
select 19661.324,    19670.246,    1 FROM  DUAL  union all
select 19670.246,    19728.048,    10 FROM  DUAL  union all
select 19728.048,    19739.708,    1 FROM  DUAL  union all
select 19739.708,    22528.106,    10 FROM  DUAL  union all
select 22528.106,    22530.145,    1 FROM  DUAL  union all
select 22530.145,    29864.117,    10 FROM  DUAL  union all
select 29864.117,    29866.117,    1 FROM  DUAL  union all
select 29866.117,    70695.245,    10 FROM  DUAL  union all
select 70695.245,    70697.306,    1 FROM  DUAL  union all
select 70697.306,    96866.3,    10 FROM  DUAL  union all
select 96866.303,    96906.59,    1 FROM  DUAL  union all
select 24675.6,    26656.2,    8 FROM  DUAL  union all
select 35462.84,    35462.85,    3 FROM  DUAL  union all
select 53701.851,    53701.86,    3 FROM  DUAL  union all
select 53702.071,    53702.08,    3 FROM  DUAL 
),
cte as (
select p.x, p.leftweight + nvl(sum(t.weight),0) as leftweight, 
       p.rightweight + nvl(sum(t.weight),0) as rightweight, 
       row_number() over (order by p.x) as ord 
from (
    select v.x, sum(v.lweight) leftweight, sum(v.rweight) rightweight from (
        select st x, 0 as lweight, weight rweight from tt union all
        select finish, weight, 0 from tt
    ) v group by v.x
) p left join tt t on p.x > t.st and p.x < t.finish 
group by p.x, p.leftweight, p.rightweight
)
SELECT  nvl(e2.x, 0) Start, e1.x Аштшыр, e2.leftweight, e2.rightweight
FROM cte e1 left join cte e2 on e1.ord-1=e2.ord
Where e1.x>e2.x


Результаты (если MS SQL можно еще проверять, то тут точно дрова)
STARTFINISHLEFTWEIGHTRIGHTWEIGHT
0 35.853 0 1
35.853 18265.487 1 10
18265.487 18265.49 0 1
18265.49 18267.474 10 0
18267.474 19661.324 1 10
19661.324 19670.246 10 1
19670.246 19728.048 1 10
19728.048 19739.708 10 1
19739.708 22528.106 1 10
22528.106 22530.145 10 1
22530.145 24675.6 1 10
24675.6 26656.2 0 8
26656.2 29864.117 8 0
29864.117 29866.117 10 1
29866.117 35462.84 1 10
35462.84 35462.85 0 3
35462.85 53701.851 3 0
53701.851 53701.86 0 3
53701.86 53702.071 3 0
53702.071 53702.08 0 3
53702.08 70695.245 3 0
70695.245 70697.306 10 1
70697.306 96866.3 1 10
96866.3 96866.303 10 0
96866.303 96906.59 0 1


Вроде все сделал аккуратно - запрос один в один. Вроде.
Что опять такого в ORACLE?

Модератор: Тема перенесена из форума "Microsoft SQL Server".


Сообщение было отредактировано: 18 окт 13, 01:17
18 окт 13, 01:07    [14988687]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7675
HResult,

А что не так? По-моему идентично.
18 окт 13, 01:20    [14988791]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
Ой, там же все не так.
Обратите внимание на leftweight и rightweight. Это суммы весов входящих отрезков в начале и в конце каждого агрегированного.
Они совсем разные, а в них вся соль.
Гляньте на оригинальный пост 14962312

Я потратил кучу времени на реальных данных в поисках причин, пока не догадался составить запросы на константах и выполнить в чистом виде в обоих средах.
И нате Вам.
Честно говоря, потрясен.
18 окт 13, 01:50    [14989169]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
Капитан очевидность на проводе
Guest
HResult
Ой, там же все не так.
Обратите внимание на leftweight и rightweight. Это суммы весов входящих отрезков в начале и в конце каждого агрегированного.
Они совсем разные, а в них вся соль.
Гляньте на оригинальный пост 14962312

Я потратил кучу времени на реальных данных в поисках причин, пока не догадался составить запросы на константах и выполнить в чистом виде в обоих средах.
И нате Вам.
Честно говоря, потрясен.


Пупсик, ты не потрясайся, а выполни свои запросы еще раз.

Вот тот SQL, что для Oracle - возвращает аккурат то, что ото у тебя в первой таблице, а не во второй (если слово start заменить и ото Аштшыр).

Ты походу в копипасте запутался, бедолашный.
18 окт 13, 01:58    [14989265]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
Капитан очевидность на проводе
HResult
Ой, там же все не так.
Обратите внимание на leftweight и rightweight. Это суммы весов входящих отрезков в начале и в конце каждого агрегированного.
Они совсем разные, а в них вся соль.
Гляньте на оригинальный пост 14962312

Я потратил кучу времени на реальных данных в поисках причин, пока не догадался составить запросы на константах и выполнить в чистом виде в обоих средах.
И нате Вам.
Честно говоря, потрясен.


Пупсик, ты не потрясайся, а выполни свои запросы еще раз.

Вот тот SQL, что для Oracle - возвращает аккурат то, что ото у тебя в первой таблице, а не во второй (если слово start заменить и ото Аштшыр).

Ты походу в копипасте запутался, бедолашный.

Это как раз не копипаст, а совсем наоборот.
Я написал FINISH на русской раскладке. Без копипаста. Да, смешно.
Но это не должно смущать королей арены.
Если есть сомнения - выложите Ваш вариант, который таки дает правильный результат.
18 окт 13, 02:03    [14989354]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
Этот запрос без русских буков, но с тем же мусором в результате.
with tt as (
select 0 as st ,    35.853 as finish,    1 as weight FROM  DUAL union all
select 35.853,    18265.49,    10 FROM  DUAL  union all
select 18265.487,    18267.474,    1 FROM  DUAL  union all
select 18267.474,    19661.324,    10 FROM  DUAL  union all
select 19661.324,    19670.246,    1 FROM  DUAL  union all
select 19670.246,    19728.048,    10 FROM  DUAL  union all
select 19728.048,    19739.708,    1 FROM  DUAL  union all
select 19739.708,    22528.106,    10 FROM  DUAL  union all
select 22528.106,    22530.145,    1 FROM  DUAL  union all
select 22530.145,    29864.117,    10 FROM  DUAL  union all
select 29864.117,    29866.117,    1 FROM  DUAL  union all
select 29866.117,    70695.245,    10 FROM  DUAL  union all
select 70695.245,    70697.306,    1 FROM  DUAL  union all
select 70697.306,    96866.3,    10 FROM  DUAL  union all
select 96866.303,    96906.59,    1 FROM  DUAL  union all
select 24675.6,    26656.2,    8 FROM  DUAL  union all
select 35462.84,    35462.85,    3 FROM  DUAL  union all
select 53701.851,    53701.86,    3 FROM  DUAL  union all
select 53702.071,    53702.08,    3 FROM  DUAL 
),
cte as (
select p.x, p.leftweight + nvl(sum(t.weight),0) as leftweight, 
       p.rightweight + nvl(sum(t.weight),0) as rightweight, 
       row_number() over (order by p.x) as ord 
from (
    select v.x, sum(v.lweight) leftweight, sum(v.rweight) rightweight from (
        select st x, 0 as lweight, weight rweight from tt union all
        select finish, weight, 0 from tt
    ) v group by v.x
) p left join tt t on p.x > t.st and p.x < t.finish 
group by p.x, p.leftweight, p.rightweight
)
SELECT  nvl(e2.x, 0) nmStart, e1.x nmEnd, e2.leftweight, e2.rightweight
FROM cte e1 left join cte e2 on e1.ord-1=e2.ord
Where e1.x>e2.x
18 окт 13, 02:11    [14989492]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
Yo.!
Guest
я не увидел отличий, последий запрос выдает идентичную первой таблице
18 окт 13, 09:57    [14995830]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
Капитан очевидность на проводе
Guest
HResult
Этот запрос без русских буков, но с тем же мусором в результате.



Вот результат из свежего Oracle. Тыкни конкретно, где там мусор то?

NMSTART	NMEND	LEFTWEIGHT	RIGHTWEIGHT
0 35.853 0 1
35.853 18265.487 1 10
18265.487 18265.49 10 11
18265.49 18267.474 11 1
18267.474 19661.324 1 10
19661.324 19670.246 10 1
19670.246 19728.048 1 10
19728.048 19739.708 10 1
19739.708 22528.106 1 10
22528.106 22530.145 10 1
22530.145 24675.6 1 10
24675.6 26656.2 10 18
26656.2 29864.117 18 10
29864.117 29866.117 10 1
29866.117 35462.84 1 10
35462.84 35462.85 10 13
35462.85 53701.851 13 10
53701.851 53701.86 10 13
53701.86 53702.071 13 10
53702.071 53702.08 10 13
53702.08 70695.245 13 10
70695.245 70697.306 10 1
70697.306 96866.3 1 10
96866.3 96866.303 10 0
96866.303 96906.59 0 1
18 окт 13, 10:32    [14996114]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
Капитан очевидность,
Ну, это совершенно другое дело. Спасибо.
Вопрос только, что такое "свежий"? У меня, вроде, 10g. (Надо спросить спецов).
Это как, свежий? Насколько?
И как может "свежесть" влиять на абсолютно детерменированный запрос?
Потому, что на моей стороне ничего не поменялось.

NMSTARTNMENDLEFTWEIGHTRIGHTWEIGHT
035.85301
35.85318265.487110
18265.48718265.4901
18265.4918267.474100
18267.47419661.324110
19661.32419670.246101
19670.24619728.048110
19728.04819739.708101
19739.70822528.106110
22528.10622530.145101
22530.14524675.6110
24675.626656.208
26656.229864.11780
29864.11729866.117101
29866.11735462.84110
35462.8435462.8503
35462.8553701.85130
53701.85153701.8603
53701.8653702.07130
53702.07153702.0803
53702.0870695.24530
70695.24570697.306101
70697.30696866.3110
96866.396866.303100
96866.30396906.5901

И что потенциально может повлиять?
18 окт 13, 11:28    [14996616]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
Yo.!
Guest
HResult,

select * from v$version;

у меня на Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit другой результат


0 35.853 0 1
35.853 18265.487 1 10
18265.487 18265.49 10 11
18265.49 18267.474 11 1
18267.474 19661.324 1 10
19661.324 19670.246 10 1
19670.246 19728.048 1 10
19728.048 19739.708 10 1
19739.708 22528.106 1 10
22528.106 22530.145 10 1
22530.145 24675.6 1 10
24675.6 26656.2 10 18
26656.2 29864.117 18 10
29864.117 29866.117 10 1
29866.117 35462.84 1 10
35462.84 35462.85 10 13
35462.85 53701.851 13 10
53701.851 53701.86 10 13
53701.86 53702.071 13 10
53702.071 53702.08 10 13
53702.08 70695.245 13 10
70695.245 70697.306 10 1
70697.306 96866.3 1 10
96866.3 96866.303 10 0
96866.303 96906.59 0 1
18 окт 13, 11:34    [14996689]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
Спасибо за подсказку. Вот что мне дает:

Oracle Database 10g Release 10.2.0.3.0
PL/SQL Release 10.2.0.3.0
CORE 10.2.0.3.0
TNS for 32-bit Windows: Version 10.2.0.3.0
NLSRTL Version 10.2.0.3.0
18 окт 13, 11:55    [14996916]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
Yo.!
Guest
HResult
Спасибо за подсказку. Вот что мне дает:

Oracle Database 10g Release 10.2.0.3.0
PL/SQL Release 10.2.0.3.0
CORE 10.2.0.3.0
TNS for 32-bit Windows: Version 10.2.0.3.0
NLSRTL Version 10.2.0.3.0


10.2.0.3.0 было пара неприятных багов, помниться у меня jdbc молча возвращал меньше строк, чем реально было в курсоре. ставьте патч скорей.
18 окт 13, 13:00    [14997642]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
Yo.!
HResult
Спасибо за подсказку. Вот что мне дает:

Oracle Database 10g Release 10.2.0.3.0
PL/SQL Release 10.2.0.3.0
CORE 10.2.0.3.0
TNS for 32-bit Windows: Version 10.2.0.3.0
NLSRTL Version 10.2.0.3.0


10.2.0.3.0 было пара неприятных багов, помниться у меня jdbc молча возвращал меньше строк, чем реально было в курсоре. ставьте патч скорей.

Спасибо, пошел топтать айтишников.
18 окт 13, 13:08    [14997722]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
HResult
Member

Откуда:
Сообщений: 132
На 10.2.0.4.0 все работает, как должно. Айтишники уволены.

Спасибо всем большое.
18 окт 13, 13:36    [14998041]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Возможно, у вас так и задумано, но "Where e1.x>e2.x" превращает ваш "left join" в "inner join", и гипотетически вы получаете не те цифры, что ожидаете. И в mssql, и в oracle.
6 фев 14, 17:18    [15530121]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE против SQL. Разные результаты. Кто поможет?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
HResult
На 10.2.0.4.0 все работает, как должно. Айтишники уволены.

Спасибо всем большое.


а ты сам-то кто?
8 фев 14, 06:45    [15538525]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить