Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос на интервью / 25 сообщений из 35, страница 1 из 2
06.02.2019, 12:39
    #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
06.02.2019, 12:47
    #39770103
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
w31,

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

критерий оптимальности?
...
Рейтинг: 0 / 0
06.02.2019, 12:49
    #39770108
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
w31более оптимально запросЕсли поубирать переводы строк и незначащие пробелы, то длина запроса оптимизируется даже не смотря на то, что нужно два раза добавить date.
...
Рейтинг: 0 / 0
06.02.2019, 13:50
    #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
06.02.2019, 14:09
    #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
06.02.2019, 14:17
    #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
06.02.2019, 14:21
    #39770163
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
Dshedooв оригинале очепятка
В оригинале - тестовое задание, которое позволяет интервьюеру оценить компетенцию кандидата.
Если бы интервьюером был я, то Ваш ответ для начала сказал бы мне, что Вы не сумели написать эквивалентный запрос :)
...
Рейтинг: 0 / 0
06.02.2019, 14:22
    #39770164
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
-2-full -> left
Как минимум, зависит от
Код: plsql
1.
2.
3.
      ,CID
      ,SUMMAEQ
      ,PLATPURPOSE
...
Рейтинг: 0 / 0
06.02.2019, 14:36
    #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
06.02.2019, 14:43
    #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
06.02.2019, 14:45
    #39770177
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
Staxа в чем зависимость?
А они в какой таблице?
-2- предложил уйти от full outer, который мог быть написан не "шоббуло".
...
Рейтинг: 0 / 0
06.02.2019, 14:54
    #39770187
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
andrey_anonymousStaxа в чем зависимость?
А они в какой таблице?
-2- предложил уйти от full outer, который мог быть написан не "шоббуло".
Код: plsql
1.
2.
3.
WHERE
	T1.[...] OR T1.[...] AND
	T1.[...]
...
Рейтинг: 0 / 0
06.02.2019, 14:56
    #39770188
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
Dshedoo
Код: plsql
1.
2.
3.
WHERE
	T1.[...] OR T1.[...] AND
	T1.[...]


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

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

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

.....
stax
...
Рейтинг: 0 / 0
06.02.2019, 15:07
    #39770199
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
Staxя в смысле как влияет на замену full outer?
С учетом where - уже никак, я "перебдел" :)
...
Рейтинг: 0 / 0
06.02.2019, 15:11
    #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
06.02.2019, 15:23
    #39770213
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
andrey_anonymousStaxя в смысле как влияет на замену full outer?
С учетом where - уже никак, я "перебдел" :)Правда замена влияет только на визуальную оптимальность.
Оптимизатор и сам разберется кто outer, а кто нет.
...
Рейтинг: 0 / 0
06.02.2019, 15:28
    #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
06.02.2019, 15:32
    #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
06.02.2019, 15:35
    #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
06.02.2019, 15:37
    #39770230
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос на интервью
w31,

WHEN T1.CAID = 111111 THEN

заменить на ELSE

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

... мой вариант корректировки case представлен для T2.KMFO not null, не надо инсинуаций :)
...
Рейтинг: 0 / 0
06.02.2019, 15:38
    #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
06.02.2019, 15:41
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос на интервью / 25 сообщений из 35, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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