Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Из разряда пятничных задачек.  [new]
TatianKa
Member

Откуда: Санкт-Петербург
Сообщений: 4
Строки с неуникальными атрибутами (9 баллов)
Дано: Таблица OLYMP_TABL с 14-ю текстовыми колонками (А1,А2,...,А14), заполненная непустыми данными.
CREATE TABLE OLYMP_TABL(
Al VARCHAR2(200) NOT NULL,
A2 VARCHAR2(200) NOT NULL,
A3 VARCHAR2(200) NOT NULL,
A4 VARCHAR2(200) NOT NULL,
A5 VARCHAR2(200) NOT NULL,
A6 VARCHAR2(200) NOT NULL,
A7 VARCHAR2(200) NOT NULL,
A8 VARCHAR2(200) NOT NULL,
A9 VARCHAR2(200) NOT NULL,
A10 VARCHAR2(200) NOT NULL,
All VARCHAR2(200) NOT NULL,
A12 VARCHAR2(200) NOT NULL,
A13 VARCHAR2(200) NOT NULL,
A14 VARCHAR2(200) NOT NULL);
Требуется: Проверить каждую колонку (атрибут) таблицы OLYMP_TABL на уникальность значений и вывести все строки таблицы OLYMP_TABL. в которых хотя бы в одной колонке встречается значение атрибута, которое в этой колонке не уникально (встречается несколько раз). Метод решения - SQL запрос.


Решение есть, но какое-то оно... не элегантное, интересны ваши варианты)
23 ноя 10, 00:30    [9822522]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
a зачем All вместо A11 ?
23 ноя 10, 00:33    [9822529]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
select * from (
select O.*, 
       count(*)over(partition by A1) +,
       count(*)over(partition by A2) +,
       count(*)over(partition by A3) +,
       count(*)over(partition by A4) +,
       count(*)over(partition by A5) +,
       count(*)over(partition by A6) +,
       count(*)over(partition by A7) +,
       count(*)over(partition by A8) +,
       count(*)over(partition by A9) +,
       count(*)over(partition by A10) +,
       count(*)over(partition by A11) +,
       count(*)over(partition by A11) +,
       count(*)over(partition by A13) +,
       count(*)over(partition by A14) a
from OLYMP_TABL) where a > 14
23 ноя 10, 00:36    [9822537]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
и
+ без опечаток
select * from (
select O.*, 
       count(*)over(partition by Al) +
       count(*)over(partition by A2) +
       count(*)over(partition by A3) +
       count(*)over(partition by A4) +
       count(*)over(partition by A5) +
       count(*)over(partition by A6) +
       count(*)over(partition by A7) +
       count(*)over(partition by A8) +
       count(*)over(partition by A9) +
       count(*)over(partition by A10) +
       count(*)over(partition by A11) +
       count(*)over(partition by A11) +
       count(*)over(partition by A13) +
       count(*)over(partition by A14) a
from OLYMP_TABL o) where a > 14
23 ноя 10, 00:41    [9822544]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
count(*) over
Guest
TatianKa,

На пятничную задачку эта не тянет :). Покажите Ваше решение.
23 ноя 10, 00:44    [9822554]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
_Nikotin
       count(*)over(partition by A1) +
       count(*)over(partition by A2) +
...
       count(*)over(partition by A14) a

Осталось уточнить - а велика ли табличка?
23 ноя 10, 00:47    [9822559]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
Сегодня явно не пятница
Guest
Да и каждая колонка - это отдельный window sort
23 ноя 10, 00:47    [9822561]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
это ж задачка всего на 9 баллов, думаю не велика.
23 ноя 10, 00:53    [9822563]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Альтернатива:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/general005.htm#i1006825
CREATE TABLE OLYMP_TABL(
A1 VARCHAR2(200) NOT NULL,
A2 VARCHAR2(200) NOT NULL,
A3 VARCHAR2(200) NOT NULL
);
 
Table created

insert into OLYMP_TABL
select 'unq a1-1','unq a2-1','unq a3-1' from dual union all
select 'unq a1-2','DUP a2-2','unq a3-2' from dual union all
select 'unq a1-3','DUP a2-2','DUP a3-3' from dual union all
select 'unq a1-4','unq a2-4','DUP a3-3' from dual;
 
4 rows inserted

create table OLYMP_exceptions(fROWID rowid, OWNER varchar2(30),TABLE_NAME varchar2(30), CONSTRAINT varchar2(30));
 
Table created

alter table OLYMP_TABL add constraint ot_uk_a1 unique (a1) exceptions into OLYMP_exceptions;
 
Table altered

alter table OLYMP_TABL add constraint ot_uk_a2 unique (a2) exceptions into OLYMP_exceptions;
 
ORA-02299: cannot validate (ANDREY.OT_UK_A2) - duplicate keys found

alter table OLYMP_TABL add constraint ot_uk_a3 unique (a3) exceptions into OLYMP_exceptions
 
ORA-02299: cannot validate (ANDREY.OT_UK_A3) - duplicate keys found

select * from OLYMP_TABL where rowid in (select frowid from OLYMP_exceptions);
 
A1         A2         A3
---------- ---------- ----------
unq a1-2   DUP a2-2   unq a3-2
unq a1-3   DUP a2-2   DUP a3-3
unq a1-4   unq a2-4   DUP a3-3
 
SQL> 
23 ноя 10, 02:05    [9822597]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
прошлогодняя задачка с олимпиады по Oracle
23 ноя 10, 09:31    [9823028]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Bfink,

и каков был размер OLYMP_TABL ?
23 ноя 10, 09:35    [9823045]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
_Nikotin,

50 строк, но проверяли на разных данных. Просили же не быстрое, а элегантное решение
23 ноя 10, 09:37    [9823054]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
_Nikotin,

кстати в первоначальном варианте колонки могли иметь NULL, но потом студентов не стали заморачивать. С null-ом у count особенности
23 ноя 10, 09:40    [9823065]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Bfink,

как-нибудь так?
select * from (
select O.*, 
       count(A1)over(partition by A1) + nvl2(A1, 0, 1) +
       count(A2)over(partition by A2) + nvl2(A2, 0, 1) +
       count(A3)over(partition by A3) + nvl2(A3, 0, 1) +
       count(A4)over(partition by A4) + nvl2(A4, 0, 1) +
       count(A5)over(partition by A5) + nvl2(A5, 0, 1) +
       count(A6)over(partition by A6) + nvl2(A6, 0, 1) +
       count(A7)over(partition by A7) + nvl2(A7, 0, 1) +
       count(A8)over(partition by A8) + nvl2(A8, 0, 1) +
       count(A9)over(partition by A9) + nvl2(A9, 0, 1) +
       count(A10)over(partition by A10) + nvl2(A10, 0, 1) +
       count(A11)over(partition by A11) + nvl2(A11, 0, 1) +
       count(A12)over(partition by A12) + nvl2(A12, 0, 1) +
       count(A13)over(partition by A13) + nvl2(A13, 0, 1) +
       count(A14)over(partition by A14) + nvl2(A14, 0, 1) a
from OLYMP_TABL o) where a > 14
23 ноя 10, 09:48    [9823099]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
Владимир Бегун
Member

Откуда: Redwood Shores, CA USA
Сообщений: 1707
 WHERE t1.ROWID <> t2.ROWID AND (t1.a1 = t2.a1 OR t1.a2 = t2.a2 OR t1.a3 = t2.a3 ...)
Although it could be that I messed up and I completely misunderstood the task. :-)
23 ноя 10, 10:17    [9823272]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 550
WHERE count(A1)<>count(distinct(A1)) 
       or count(A2)<>count(distinct(A2)) 
       ... 
       or count(A14)<>count(distinct(A14)) 
 
23 ноя 10, 11:02    [9823600]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
j2k
WHERE count(A1)<>count(distinct(A1)) 
       or count(A2)<>count(distinct(A2)) 
       ... 
       or count(A14)<>count(distinct(A14)) 
 

а полностью запрос?
23 ноя 10, 11:04    [9823620]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 550
_Nikotin
j2k
WHERE count(A1)<>count(distinct(A1)) 
       or count(A2)<>count(distinct(A2)) 
       ... 
       or count(A14)<>count(distinct(A14)) 
 

а полностью запрос?

А тут что-то непонятно?
23 ноя 10, 11:22    [9823749]     Ответить | Цитировать Сообщить модератору
 ORA-934  [new]
-2-
Member

Откуда:
Сообщений: 15330
j2k
А тут что-то непонятно?
Да все понятно.
23 ноя 10, 11:24    [9823763]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
j2k,

группировка непонятная
23 ноя 10, 11:24    [9823765]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Владимир Бегун
 WHERE t1.ROWID <> t2.ROWID AND (t1.a1 = t2.a1 OR t1.a2 = t2.a2 OR t1.a3 = t2.a3 ...)
Although it could be that I messed up and I completely misunderstood the task. :-)

Знатный "размножатор" получится...
23 ноя 10, 11:24    [9823767]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
andrey_anonymous
Знатный "размножатор" получится...

можно в exists затолкать, Владимир не сказал откуда это where :)
23 ноя 10, 11:26    [9823777]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 550
_Nikotin
j2k,
группировка непонятная

Там нет группировки
23 ноя 10, 11:36    [9823909]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
j2k
_Nikotin
j2k,
группировка непонятная

Там нет группировки

а что тогда в select-е? не мучайте, покажите весь запрос :)
23 ноя 10, 11:39    [9823938]     Ответить | Цитировать Сообщить модератору
 Re: Из разряда пятничных задачек.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
_Nikotin
Владимир не сказал откуда это where :)

Вот именно :)
23 ноя 10, 11:41    [9823959]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить