Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 34 35 36 37 38 39 40 41 [42] 43   вперед  Ctrl
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 907
Oracle 11g, 12c
SQL> with t(id) as (select level from dual connect by level <= 3)
  2  , t1(id) as (select 1 from dual union select 2 from dual)
  3  , t2(id) as (select 3 from dual union select 2 from dual)
  4  select *
  5  from t
  6  join t1 tt on t.id = tt.id
  7  join t2 tt on t.id = tt.id
  8  /

        ID         ID         ID
---------- ---------- ----------
         2          2          2


Или еще хуже
SQL> with t(id) as (select level from dual connect by level <= 3)
  2  , t1(id) as (select 1 from dual union select 2 from dual)
  3  , t2(id) as (select 3 from dual union select 2 from dual)
  4  select *
  5  from t
  6  join t1 tt on t.id = tt.id
  7  left join t1 tt on t.id = tt.id
  8  left join t2 on tt.id = t2.id
  9  /

        ID         ID         ID         ID
---------- ---------- ---------- ----------
         2          2          2          2
         1          1          1


MSSQL такого безобразия не позволяет.
with t(id) as (select 1 union select 2 union select 3)
, t1(id) as (select 1 union select 2)
, t2(id) as (select 3 union select 2)
select * 
from t
join t1 tt on t.id = tt.id
join t2 tt on t.id = tt.id

Msg 1011, Level 16, State 1, Line 1
The correlation name 'tt' is specified multiple times in a FROM clause.


А вы говорите Оракл, Оракл...
14 янв 21, 17:01    [22263398]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1837
with t(id) as (select level from dual connect by level <= 3)
      , t1(id) as (select 1 from dual union select 2 from dual)
, t2(id) as (select 3 from dual union select 2 from dual)
select t.*, tt.*
from t, t1 tt, t2 tt
where t.id = tt.id
and t.id = tt.id

ORA-00918: column ambiguously defined


А вы все - ANSI, ANSI.
14 янв 21, 17:14    [22263408]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 907
dmdmdm,

От того что без ANSI исключение выстрелит с большей вероятностью не значит что Oracle запрещает одинаковые алиасы в принципе.
SQL> with t(id) as (select level from dual connect by level <= 3)
  2  , t1(id1) as (select 1 from dual union select 2 from dual)
  3  , t2(id2) as (select 3 from dual union select 2 from dual)
  4  select t.*
  5    from t, t1 tt, t2 tt
  6   where t.id = tt.id1
  7     and t.id = tt.id2
  8  /

        ID
----------
         2


MSSQL
with t(id) as (select 1 union select 2 union select 3)
, t1(id) as (select 1 union select 2)
, t2(id) as (select 3 union select 2)
select t.*
  from t, t1 tt, t2 tt
 where t.id = tt.id1
   and t.id = tt.id2

Msg 1011, Level 16, State 1, Line 1
The correlation name 'tt' is specified multiple times in a FROM clause.
14 янв 21, 17:40    [22263426]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 907
Праздный интерес...

Predicate Move-Around такой умный что догадывается запрос
select *
  from (select b, min(a) min_a from t group by b)
  join dual
    on min_a <= 0;

Преобразовать в
SELECT "from$_subquery$_001"."B"     "B",
       "from$_subquery$_001"."MIN_A" "MIN_A",
       "DUAL"."DUMMY"                "DUMMY"
  FROM (SELECT "T"."B" "B", MIN("T"."A") "MIN_A"
          FROM "T" "T"
         WHERE "T"."A" <= 0
         GROUP BY "T"."B"
        HAVING MIN("T"."A") <= 0) "from$_subquery$_001",
       "DUAL" "DUAL"

Соответственно прочитав 1 строку из таблицы вместо миллиона.
+
create table t(a,b) as
with t(id) as
(select level from dual connect by level <= 1000)
select 0, 0 from dual union all select * from t t1, t t2

create index t_ab on t(a, b);


Можно ли этого же эффекта добиться при банальном
select b, min(a) min_a
  from t
 group by b
having min(a) <= 0
?

Или может на новых версиях реализовали уже по умолчанию? (под рукой нет свежее 12.2)
15 янв 21, 16:53    [22264052]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18618
Здесь таки немного неправильно -- нельзя гарантировать однозначности, хотя на мой взгляд ошибка должна быть другой
Или копи-паст подвел
Кобанчег
MSSQL
with t(id) as (select 1 union select 2 union select 3)
, t1(id) as (select 1 union select 2)
, t2(id) as (select 3 union select 2)
select t.*
  from t, t1 tt, t2 tt
 where t.id = tt.id1
   and t.id = tt.id2

Msg 1011, Level 16, State 1, Line 1
The correlation name 'tt' is specified multiple times in a FROM clause.
16 янв 21, 06:05    [22264242]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 907
Вячеслав Любомудров
Или копи-паст подвел
Да, следует читать как
with t(id) as (select 1 union select 2 union select 3)
, t1(id1) as (select 1 union select 2)
, t2(id2) as (select 3 union select 2)
select t.*
  from t, t1 tt, t2 tt
 where t.id = tt.id1
   and t.id = tt.id2
16 янв 21, 19:34    [22264482]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Алиас нужен и для разрешения конфликтов (в том числе column ambiguously defined)

Требования уникальности в доке вроде нет

Если конфликтов нет, команду можно выполнить коректно, то зачем генеритиь ошибку

имхо оракля поступает более правильно чем напр MS

....
stax
18 янв 21, 09:57    [22264917]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 907
Stax
Если конфликтов нет, команду можно выполнить коректно, то зачем генеритиь ошибку
Речь про ansi syntax joins или про случай когда все таблицы через запятую?

Если первое, то полагаю тут очевидна кривизна трансформации.
with t(id) as (select level from dual connect by level <= 3)
, t1(id, x) as (select 1, 1 from dual union all select 2, 11 from dual union all select 2, 111 from dual)
, t2(id, x) as (select 3, 2 from dual union all select 2, 22 from dual union all select 2, 222 from dual)
, t3(x) as (select '111' from dual union all select '222' from dual)
select tt.x --> здесь tt алиас для t1
from t
join t1 tt on t.id = tt.id --> здесь тоже для t1
join t2 tt on t.id = tt.id --> здесь для t2
join t3 on tt.x = t3.x     --> здесь опять для t1

Если второе, то имхо это абсурд когда один и тот же алиас ссылается на две разные таблицы.
Зачем показывать ошибку? Потому что плюсов от этой "фичи" нет, а опасность есть.
Stax
Требования уникальности в доке вроде нет
Речь не про [не]соответствие доке, а про разумность взагалі.
Stax
имхо оракля поступает более правильно чем напр MS
Зашел проверить на dbfiddle.uk
Так же как mssql работают еще
postgres
mysql
maria db
firebird (проверяет дублирование имени именно для алиасов но не для таблиц - *)
+
impala
etc

Так же как Oracle работает DB2 и sqlite.

+ *
То есть ошибка свалилтся для
select 1 from t tt, t tt;

Но не
select 1 from t, t;

На остальных достаточно простого случая для невыполнения.
19 янв 21, 03:28    [22265600]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Кобанчег

Зачем показывать ошибку? Потому что плюсов от этой "фичи" нет, а опасность есть.
Речь не про [не]соответствие доке, а про разумность взагалі.


опасность чего?

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

домахатся можно и наоборот, почемув в MS ошибка, если все однозначно разрешается

ето из, запретить/разрешить неявное преобразование

меня напр другое смущает, почему
This alias is required if the select list references any object type attributes or object type methods.

.....
stax
19 янв 21, 10:02    [22265644]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
Человек так долго пытавшийся в десятке тем сделать html из ref_cursor всё-таки сдался
20 янв 21, 15:04    [22266537]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1728
Кобанчег,

Кобанчег
Можно ли этого же эффекта добиться при банальном

select b, min(a) min_a
  from t
 group by b
having min(a) <= 0


С переписыванием:
SQL> select /*+ gather_plan_statistics no_merge(@t)*/
  2         b, min_a
  3    from (select /*+ qb_name(t)*/
  4                 b, min(a) min_a
  5            from t
  6           group by b)
  7   where min_a <= 0
  8  /

         B      MIN_A
---------- ----------
         0          0

SQL> select * from dbms_xplan.display_cursor(format=> 'allstats last');

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------
SQL_ID  1sp33zv68y3c3, child number 0
-------------------------------------
select /*+ gather_plan_statistics no_merge(@t)*/        b, min_a   from
(select /*+ qb_name(t)*/                b, min(a) min_a           from
t          group by b)  where min_a <= 0

Plan hash value: 533881736

--------------------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      1 |00:00:00.01 |       3 |      5 |       |       |          |
|   1 |  VIEW               |      |      1 |     32 |      1 |00:00:00.01 |       3 |      5 |       |       |          |
|*  2 |   FILTER            |      |      1 |        |      1 |00:00:00.01 |       3 |      5 |       |       |          |
|   3 |    HASH GROUP BY    |      |      1 |     32 |      1 |00:00:00.01 |       3 |      5 |  1200K|  1200K|  787K (0)|
|*  4 |     INDEX RANGE SCAN| T_AB |      1 |    999 |      1 |00:00:00.01 |       3 |      5 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(MIN("A")<=0)
   4 - access("A"<=0)

По-хорошему, есть fix control 25948370 allow pushing of simple HAVING predicate to group by row source, но что-то не пойму, как он точно работает.
Так это случай, когда Oracle применяет больший набор трансформаций для более комплексных запросов.
1 фев 21, 17:40    [22272739]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Alexander Anokhin
Member

Откуда: Хабаровск
Сообщений: 524
SeaGate
есть fix control 25948370 allow pushing of simple HAVING predicate to group by row source, но что-то не пойму, как он точно работает.


вот так
alter session set "_fix_control"="25948370:0";

select b,
       sum(a)
  from t
 group by b
having sum(a) <= 0;

------------------------------------------------------
| Id  | Operation           | Name | Starts | A-Rows |
------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |      1 |
|*  1 |  FILTER             |      |      1 |      1 |
|   2 |   HASH GROUP BY     |      |      1 |   1001 |
|   3 |    TABLE ACCESS FULL| T    |      1 |   1000K|
------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(SUM("A")<=0)


alter session set "_fix_control"="25948370:1";

select b,
       sum(a)
  from t
 group by b
having sum(a) <= 0;

-----------------------------------------------------
| Id  | Operation          | Name | Starts | A-Rows |
-----------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |      1 |
|*  1 |  HASH GROUP BY     |      |      1 |      1 |
|   2 |   TABLE ACCESS FULL| T    |      1 |   1000K|
-----------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(SUM("A")<=0)


для min/max эта оптимизация не поддерживается
1 фев 21, 20:16    [22272852]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1728
Alexander Anokhin
вот так

Спасибо за демонстрацию. Начальному запросу это не поможет изменить метод доступа, но что делает данный fix control знать полезно.
1 фев 21, 23:00    [22272949]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Alexander Anokhin,

для sum нельзя access("A"<=0), результат будет другим (неверным)

.....
stax
2 фев 21, 09:30    [22273054]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 955
Стали пропадать пользователи. Ничего не нашли ни в dba_audit_trail, ни в sys audit operations. Система финансовая , дело серьезное. Довольно быстро нашли - пользователей нету в dba_users, но есть в sys.user$. Посмотрели на view - выяснили , пропадает на условии
     and ((u.astatus = m.status#) or
          (u.astatus = (m.status#   16 - BITAND(m.status#, 16))))

Эта хрень в 19 новая (похоже - с 12, в 11 нету ) где м - это sys.user_astatus_маp а u это sys.user$. В user_astatus_маp ничего не поменялось , а вот все пропавшие пользователи имеют sys.user$.astatus = 12. В общем , ситуация возникает когда включен profile с INACTIVE_ACCOUNT_TIME. (тоже походу новый ресурс ) и если пользователь был залочен а потом сработал INACTIVE_ACCOUNT_TIME. Нашли Ноту 2734949.1, говорят solution:
update user$ set astatus = astatus - 4 where ( astatus = 12 or astatus = 13);




Regards
19 фев 21, 14:52    [22283522]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 955
Maxim Demenko,

Если кому понадобится - таблетка 29341782 есть

Regards
19 фев 21, 20:27    [22283763]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
where  upper (nvl (tn.name_kded,'*')) =  'ШТ'
когда спрашиваешь, нафига здесь нвл - говорят, так надежнее

ЗЫ: не моя задача, не мои и не мне постановки
ЗЫ1: Переучить невозможно, уже пытался
1 мар 21, 10:26    [22287758]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 938
andreymx
говорят, так надежнее
а на вопрос "почему надежнее?" что отвечают?
1 мар 21, 11:31    [22287784]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
их напугали в 2003-м
что с наллами надо обращаться аккуратно, и нвл - это панацея
1 мар 21, 12:25    [22287811]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Агрох
Member

Откуда:
Сообщений: 136
andreymx
where  upper (nvl (tn.name_kded,'*')) =  'ШТ'
когда спрашиваешь, нафига здесь нвл - говорят, так надежнее


Единственное что на ум приходит, это влияние на скорость разработки, когда вдруг надо заменить " = 'ШТ'" на " != 'ШТ'" - кто там помнить будет, что NULL = 'ШТ' не возвращает строку не потому что NULL != 'ШТ', а потому что любые операции сравнения, где одно из значений - NULL всегда FALSE.

Сообщение было отредактировано: 1 мар 21, 13:26
1 мар 21, 13:32    [22287847]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
Агрох
Единственное что на ум приходит, это влияние на скорость разработки, когда вдруг надо заменить " = 'ШТ'" на " != 'ШТ'"
я всегда всем молодым этот момент показываю на пальцах и с примерами
2 мар 21, 14:36    [22288376]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
andreymx
я всегда всем молодым этот момент показываю на пальцах и с примерами

перестарались

.....
stax
2 мар 21, 16:46    [22288497]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 907
Стало любопытно, вот если какой-то пакет недокументирован, а с другой стороны фигурирует в номе на металинке в разделе HOWTO, например:
How Parallel Execution Differs Between CREATE INDEX and DBMS_INDEX_UTL (Doc ID 959905.1)

Значит ли что допустимо на продакшене пользоваться DBMS_INDEX_UTL для перестройки индексов или поддержка в случае проблем всегда сможет сказать - это не для вас писалось.
5 авг 21, 02:33    [22355397]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Жук в муравейнике
Member

Откуда:
Сообщений: 725
Агрох
а потому что любые операции сравнения, где одно из значений - NULL всегда FALSE.

што?
11 авг 21, 01:49    [22357892]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Scott Tiger
Member

Откуда: вмваре
Сообщений: 6905
Чья ласточка?

К сообщению приложен файл. Размер - 134Kb
22 авг 21, 23:10    [22362925]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 34 35 36 37 38 39 40 41 [42] 43   вперед  Ctrl
Все форумы / Oracle Ответить