powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос на интервью
35 сообщений из 35, показаны все 2 страниц
Вопрос на интервью
    #39770100
w31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
w31
Гость
Возможно ли написать более оптимально запрос :

SELECT
DOCUMENTNO,
CASE
WHEN T1.DAID = 111111 THEN 'DB'
WHEN T1.CAID = 111111 THEN 'CR'
END DBCRD,
SITEID,
CASE
WHEN T1.DAID = 111111 THEN T1.AANO
WHEN T1.CAID = 111111 AND T1.ID = T2.ID_BI2 THEN T2.KACC
WHEN T1.CAID = 111111 THEN T1.ABNO
END SAMEACC,
CASE
WHEN T1.DAID = 111111 THEN T1.BAID
WHEN T1.CAID = 111111 AND T1.ID = T2.ID_BI2 THEN T2.KMFO
WHEN T1.CAID = 111111 THEN T1.BBID
END SAMEMFO,
CASE
WHEN T1.DAID = 111111 THEN T1.CABNAME
WHEN T1.CAID = 111111 AND TABLE1.ID = T2.ID_BI2 THEN T2.NAME_PAYEE
WHEN T1.CAID = 111111 THEN T1.CABNAME
END SAMENAME,
(SELECT
t.SNAME
FROM
SOMECODE t WHERE T.ID = CASE
WHEN DAID = 111111 THEN AID
WHEN CAID = 111111 THEN BID
END ) VALUEB,
CID,
SUMMAEQ,
PLATPURPOSE
FROM TABLE1 T1
FULL OUTER JOIN TABLE2 T2 ON T1.ID = T2.ID_BI2 WHERE
T1.DAID = 111111 OR T1.CAID = 111111 AND
T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30'
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770103
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w31,

full -> left
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770104
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w31,

критерий оптимальности?
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770108
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w31более оптимально запросЕсли поубирать переводы строк и незначащие пробелы, то длина запроса оптимизируется даже не смотря на то, что нужно два раза добавить date.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770138
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SELECT
	DOCUMENTNO,
	'DB' as DBCRD,
	SITEID,
	T1.AANO as SAMEACC,
  T1.BAID as SAMEMFO,
  T1.CABNAME as SAMENAME,
	t.SNAME as VALUEB,
	CID,
	SUMMAEQ,
	PLATPURPOSE
	FROM TABLE1 T1
  LEFT JOIN SOMECODE t on T.ID = AID
	LEFT JOIN TABLE2 T2 ON T1.ID = T2.ID_BI2 
  WHERE	T1.DAID = 111111 
  AND	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30' 
union all
SELECT
	DOCUMENTNO,
  'CR' as DBCRD,
	SITEID,
	nvl(T2.KACC,T1.ABNO) as SAMEACC,
  nvl(T2.KMFO,T1.BBID) as SAMEMFO,
  nvl(T2.NAME_PAYEE,T1.CABNAME) as SAMENAME,
	t.SNAME as VALUEB,
	CID,
	SUMMAEQ,
	PLATPURPOSE
	FROM TABLE1 T1
  LEFT JOIN SOMECODE t on T.ID = BID
	LEFT JOIN TABLE2 T2 ON T1.ID = T2.ID_BI2 
  WHERE	T1.DAID != 111111 and T1.CAID = 111111 
  AND	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30'   
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770153
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: plsql
1.
2.
3.
4.
5.
6.
  WHERE	T1.DAID = 111111 
  AND	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30' 
union all
...
  WHERE	T1.DAID != 111111 and T1.CAID = 111111 
  AND	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30'   


Неверно.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770158
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousDshedoo
Код: plsql
1.
2.
3.
4.
5.
6.
  WHERE	T1.DAID = 111111 
  AND	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30' 
union all
...
  WHERE	T1.DAID != 111111 and T1.CAID = 111111 
  AND	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30'   


Неверно.

Если я правильно понял, то в оригинале очепятка в виде отсутствующих скобок:

Код: plsql
1.
2.
T1.DAID = 111111 OR T1.CAID = 111111 AND
	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30' 



Код: plsql
1.
2.
(T1.DAID = 111111 OR T1.CAID = 111111) AND
	T1.SOMEDATE BETWEEN '2018-11-01' AND '2018-11-30' 
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770163
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedooв оригинале очепятка
В оригинале - тестовое задание, которое позволяет интервьюеру оценить компетенцию кандидата.
Если бы интервьюером был я, то Ваш ответ для начала сказал бы мне, что Вы не сумели написать эквивалентный запрос :)
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770164
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-full -> left
Как минимум, зависит от
Код: plsql
1.
2.
3.
      ,CID
      ,SUMMAEQ
      ,PLATPURPOSE
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770170
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousDshedooв оригинале очепятка
В оригинале - тестовое задание, которое позволяет интервьюеру оценить компетенцию кандидата.
Если бы интервьюером был я, то Ваш ответ для начала сказал бы мне, что Вы не сумели написать эквивалентный запрос :)

С таким подходом можно и по поводу алиасов придираться, например:
Код: plsql
1.
2.
SOMECODE t WHERE T.ID = CASE
	WHEN DAID = 111111 THEN AID



Вдруг тут имелся ввиду не T1.DAID, а T.DIAD или T2.DAID.
Нигде же не сказано, что запрос возвращает данные, а не ORA-01427
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770176
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous-2-full -> left
Как минимум, зависит от
Код: plsql
1.
2.
3.
      ,CID
      ,SUMMAEQ
      ,PLATPURPOSE


а в чем зависимость?

ps
если T1.SOMEDATE тип date, я б дописал date '2018-11-01' AND date '2018-11-30'

....
stax
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770177
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxа в чем зависимость?
А они в какой таблице?
-2- предложил уйти от full outer, который мог быть написан не "шоббуло".
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770187
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousStaxа в чем зависимость?
А они в какой таблице?
-2- предложил уйти от full outer, который мог быть написан не "шоббуло".
Код: plsql
1.
2.
3.
WHERE
	T1.[...] OR T1.[...] AND
	T1.[...]
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770188
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: plsql
1.
2.
3.
WHERE
	T1.[...] OR T1.[...] AND
	T1.[...]


Вы правы.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770191
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousStaxа в чем зависимость?
А они в какой таблице?
-2- предложил уйти от full outer, который мог быть написан не "шоббуло".

я в смысле как влияет на замену full outer?

ps
я б добавил всюду алиасы, но на оптимальность ето повлияет мизерно

.....
stax
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770199
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxя в смысле как влияет на замену full outer?
С учетом where - уже никак, я "перебдел" :)
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770205
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
	nvl(T2.KACC,T1.ABNO) as SAMEACC,
  nvl(T2.KMFO,T1.BBID) as SAMEMFO,
  nvl(T2.NAME_PAYEE,T1.CABNAME) as SAMENAME,



Код: plsql
1.
2.
3.
	nvl2(T2.ID_BI2,T2.KACC,T1.ABNO) as SAMEACC,
  nvl2(T2.ID_BI2,T2.KMFO,T1.BBID) as SAMEMFO,
  nvl2(T2.ID_BI2,T2.NAME_PAYEE,T1.CABNAME) as SAMENAME,
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770213
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousStaxя в смысле как влияет на замену full outer?
С учетом where - уже никак, я "перебдел" :)Правда замена влияет только на визуальную оптимальность.
Оптимизатор и сам разберется кто outer, а кто нет.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770220
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: plsql
1.
  nvl(T2.NAME_PAYEE,T1.CABNAME) as SAMENAME,



Код: plsql
1.
  nvl2(T2.ID_BI2,T2.NAME_PAYEE,T1.CABNAME) as SAMENAME,


Опять неверно :)
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770224
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: plsql
1.
	nvl(T2.KACC,T1.ABNO) as SAMEACC,



CASE
WHEN T1.DAID = 111111 THEN T1.AANO
WHEN T1.CAID = 111111 AND T1.ID = T2.ID_BI2 THEN T2.KACC
WHEN T1.CAID = 111111 THEN T1.ABNO
END SAMEACC,


и тд
....
stax
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770228
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxи тд
Да.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
with table1(ID, DAID,CAID,BAID,BBID) as(
                    select 1, 111111, 222222, 'T1.BAID', 'T1.BBID'
from dual union all select 2, 111111, 222222, 'T1.BAID', 'T1.BBID'
from dual union all select 3, 222222, 111111, 'T1.BAID', 'T1.BBID'
from dual union all select 4, 222222, 111111, 'T1.BAID', 'T1.BBID'
from dual )
, table2(ID_BI2, KMFO) as ( select 1, 'T2.KMFO'
from dual union all select 3, 'T2.KMFO'
from dual )
----------------------------
select id, daid,caid, ID_BI2
     , CASE WHEN T1.DAID = 111111 THEN T1.BAID
            WHEN T1.CAID = 111111 AND T1.ID = T2.ID_BI2 THEN T2.KMFO
            WHEN T1.CAID = 111111 THEN T1.BBID
       END SAMEMFO_ORIG
     , CASE 111111
            WHEN T1.DAID THEN T1.BAID
            WHEN T1.CAID THEN coalesce(T2.KMFO, T1.BBID)
        END SAMEMFO_ANE
     , nvl(T2.KMFO,T1.BBID) as SAMEMFO_DSHEDOO
     , nvl2(T2.ID_BI2,T2.KMFO,T1.BBID) as SAMEMFO_DSHEDOO2
  FROM TABLE1 T1
  LEFT JOIN TABLE2 T2 ON T1.ID = T2.ID_BI2
 WHERE T1.DAID = 111111
    OR T1.CAID = 111111
;
        ID       DAID       CAID     ID_BI2 SAMEMFO_ORIG SAMEMFO_ANE SAMEMFO_DSHEDOO SAMEMFO_DSHEDOO2
---------- ---------- ---------- ---------- ------------ ----------- --------------- ----------------
         1     111111     222222          1 T1.BAID      T1.BAID     T2.KMFO         T2.KMFO
         3     222222     111111          3 T2.KMFO      T2.KMFO     T2.KMFO         T2.KMFO
         4     222222     111111            T1.BBID      T1.BBID     T1.BBID         T1.BBID
         2     111111     222222            T1.BAID      T1.BAID     T1.BBID         T1.BBID

SQL> 

...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770230
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w31,

WHEN T1.CAID = 111111 THEN

заменить на ELSE

.....
stax
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770232
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousStaxи тд
Да.

... мой вариант корректировки case представлен для T2.KMFO not null, не надо инсинуаций :)
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770233
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxDshedoo
Код: plsql
1.
	nvl(T2.KACC,T1.ABNO) as SAMEACC,



CASE
WHEN T1.DAID = 111111 THEN T1.AANO
WHEN T1.CAID = 111111 AND T1.ID = T2.ID_BI2 THEN T2.KACC
WHEN T1.CAID = 111111 THEN T1.ABNO
END SAMEACC,


и тд
....
stax

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
	[...],
	T1.AANO as SAMEACC,
        [...]
	FROM [...]
  WHERE	T1.DAID = 111111 
      AND [...]
union all
SELECT
       [...],
       nvl2(T2.ID_BI2,T2.KACC,T1.ABNO) as SAMEACC,
       [...],
       FROM [...]
  WHERE	T1.DAID != 111111 and T1.CAID = 111111
      AND [...]



NVL я заменил на NVL2, т.к. если T2.KACC is null, чтобы вернулся null.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770236
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: plsql
1.
2.
3.
4.
5.
  WHERE	T1.DAID = 111111 
      AND [...]
union all
  WHERE	T1.DAID != 111111 and T1.CAID = 111111
      AND [...]



Тогда приводите решение целиком, фрагменты по умолчанию относятся к оригиналу.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770238
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
WHEN T1.CAID THEN coalesce(T2.KMFO, T1.BBID)

T2.KMFO not null?

ELSE не подойдет?

....
stax
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770239
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxELSE не подойдет?

Я случайно опубликовал один из размышлизмов.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770244
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

лично я б OR на UNION ALL не менял (пусть ето делает оптимизатор)

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

.....
stax
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770247
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxDshedoo,

лично я б OR на UNION ALL не менял (пусть ето делает оптимизатор)

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

.....
stax

Это только для оптимизации кейсов.
Как мне кажется, если этот запрос и можно хорошо оптимизировать, то только через UNION.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770258
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooКак мне кажется, если этот запрос и можно хорошо оптимизировать, то только через UNION.
1. Оптимизация невозможна без конкретной цели и конкретного окружения.
2. Если, к примеру, цель - сокращение dbtime и нагрузки на IO указанного запроса, в table1 триллион записей и предикат "CAID = 111111" низкоселективен, то идея организации двойного прохода по table1 покажется слегка неумной.
3. Ваш вариант union all не эквиваленте исходному запросу.
4. Когда сделаете эквивалентным - рассмотрите случай CAID=DAID=111111

Можно перевести case expression из searched в simple - это несколько сократит издержки и упростит текст почти безотносительно к прочим факторам при условии, что соответствующие атрибуты TABLE2 not null - иначе simple форма становится неудобочитаемой.

Остальное - только "по месту".
К примеру, на решение повлияет возможность ситуации CAID=DAID=111111, соотношение мощностей DAID=111111 и (CAID=111111 and DAID<>111111), наличие индексов, доступный объем памяти и т.д.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770269
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous3. Ваш вариант union all не эквиваленте исходному запросу.
4. Когда сделаете эквивалентным - рассмотрите случай CAID=DAID=111111

3. Можете, конечно, убрать из первого запроса условие по дате, сути это не изменит.
4. Он рассмотрен.

Остальное из разряда "трава зелёная, а небо голубое".
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770275
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooЭто только для оптимизации кейсов.
Как мне кажется, если этот запрос и можно хорошо оптимизировать, то только через UNION.
может ето и имели ввиду хозяева, хз

на собеседовании обычно волнуешся, и я б сразу не додул до union all

зы
я при ручной замене OR на UNION ALL іспользовал LNNVL

зии
интересно что предложил w31 и пошел ли он тест
....
stax
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770290
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo4. Он рассмотрен.

Остальное из разряда "трава зелёная, а небо голубое".
4.1 DAID = null, CAID = 111111

"остальное" - печальная правда жизни.
Нельзя оптимизировать сферического коня по неопределенному критерию, любое конкретное предложение будет встречено контраргументом.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770296
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousDshedoo4. Он рассмотрен.

Остальное из разряда "трава зелёная, а небо голубое".
4.1 DAID = null, CAID = 111111

"остальное" - печальная правда жизни.
Нельзя оптимизировать сферического коня по неопределенному критерию, любое конкретное предложение будет встречено контраргументом.

4.1. Вы правы.
Тогда, как Stax написал выше, необходим LNNVL.
...
Рейтинг: 0 / 0
Вопрос на интервью
    #39770310
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax и пошел ли он тест
для теста запрос перегружен лишними символами и не имеет осмысленного решения.
Неоднозначность хороша только для дискуссии, а дискуссия предполагает листок и собеседника. Вряд ли автор набирал это с листка.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос на интервью
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]