Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вывести уникальные значения без DISTINCT  [new]
KtoYa
Member

Откуда:
Сообщений: 4
Добрый день.
Столкнулся с такой задачей.
Условно есть две связанные таблицы

User Char
№ name №_us Opt
1 Василий 1 x
2 Алексей 2 x,y,z
3 Иван 3 z
4 Александр 4 a,b
5 Сергей 5 y,z

Необходимо вывести пользователей, для которых в столбце opt соответствует хотя бы один из параметров x,y,z. При этом важно, чтобы пользователи не повторялись. Как это можно сделать без применения DISTINCT и GROUP BY?

То есть правильным вариантом в данном случае будет вывод (если по номерам)
1
2
3
5
31 окт 19, 11:55    [22006977]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
-2-
Member

Откуда:
Сообщений: 14994
KtoYa
чтобы пользователи не повторялись
Нерепрезентативные данные.

KtoYa
без применения DISTINCT и GROUP BY
join может быть неявный (semi)
31 окт 19, 12:18    [22007026]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
KtoYa
Member

Откуда:
Сообщений: 4
User
№ name
1 Василий
2 Алексей
3 Иван
4 Александр
5 Сергей

Char
№_us Opt
1 x
2 x,y,z
3 z
4 a,b
5 y,z

Для лучшей смотрительности.
31 окт 19, 12:22    [22007029]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
KtoYa
Member

Откуда:
Сообщений: 4
-2-,
Пытался, закладывая внутрь, помимо условия равенства номеров еще IN(x,y,z), однако не получается почему то.
31 окт 19, 13:01    [22007068]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
-2-
Member

Откуда:
Сообщений: 14994
KtoYa
Пытался, закладывая внутрь
Для решения проблем достаточно закладывать за воротник.
31 окт 19, 13:12    [22007082]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 6829
KtoYa,

Сир,
Студентам, желающим помощи
HOWTO :: Как правильно задавать вопросы

1) Полная постановка задачи (без сокращений)
2) Подготовьте тестовые данные, лучше в виде with
например (не ваш случай):

with tbl(col1,col2,col3) as (
select 1,'name1',to_date('11.02.1921','DD.MM.YYYY') from dual union all
select 2,'name2',to_date('11.02.1922','DD.MM.YYYY') from dual union all
)
select col2 from tbl...

2) Покажите что сделали,

3) используйте Тэги, читать код без них неудобно
31 окт 19, 13:15    [22007096]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
yvprod
Member

Откуда:
Сообщений: 16
KtoYa, exists

Сообщение было отредактировано: 31 окт 19, 14:46
31 окт 19, 14:45    [22007218]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
dimyaz
Member

Откуда:
Сообщений: 436
KtoYa,

Если в одной из таблиц клиенты уникальные, то можно через exists
31 окт 19, 14:52    [22007231]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
KtoYa
Member

Откуда:
Сообщений: 4
Спасибо за участие. Нашёл ошибку.
В начале джойнил сразу вторую таблицу (в которой содержаться указатели x,y,z), поэтому, при использовании exists и размещение внутри него ссылки на первую таблицу (юзеры) запросы дублировались.
31 окт 19, 16:09    [22007329]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
artas
Member

Откуда: Киев сити
Сообщений: 1016
KtoYa
Вывести уникальные значения без DISTINCT

group by по всем полям
1 ноя 19, 15:27    [22008202]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
microbash
Member

Откуда:
Сообщений: 155
KtoYa,

а где собственно в задании повторы имен?
Если взять задание с повторами имен, например:


Табличка sql1
N	NAME
1	Василий
2	Алексей
3	Иван
4	Александр
5	Василий


Табличка sql2
N_US	OPT
1	x
2	x,y,z
3	z
4	a,b
5	y,z


И нужно выбрать пользователей без повторов (именно пользователей, как указано в задании, а не их номера), то у меня получилось:

select name from (
select 
first_value(name) over (partition by name order by name) as name,
row_number() over (partition by name order by name) as rowno
 from sql1, sql2 where sql1.n = sql2.n_us and (sql2.opt like '%x%' or sql2.opt like '%y%' or sql2.opt like '%z%')
) where rowno = 1;


Выдает:
NAME
Алексей
Василий
Иван
11 ноя 19, 22:41    [22013987]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
-2-
Member

Откуда:
Сообщений: 14994
micrеbash
И нужно выбрать пользователей без повторов (именно пользователей, как указано в задании, а не их номера)
У сущности User есть поля № и name. Дай-ка подумать, что есть пользователь...
12 ноя 19, 07:07    [22014086]     Ответить | Цитировать Сообщить модератору
 Re: Вывести уникальные значения без DISTINCT  [new]
microbash
Member

Откуда:
Сообщений: 155
Можно даже и номер добавить, только задать критерий выбора из одинаковых имен, например первую запись или последнюю.

select n,name from (
select 
first_value(name) over (partition by name order by name) as name,
first_value(n) over (partition by name order by name) as n,
row_number() over (partition by name order by name) as rowno
 from sql1, sql2 where sql1.n = sql2.n_us and (sql2.opt like '%x%' or sql2.opt like '%y%' or sql2.opt like '%z%')
) where rowno = 1 order by n;


Выдача:
N	NAME
1	Василий
2	Алексей
3	Иван


Или так:
select n,name from (
select 
first_value(name) over (partition by name order by name) as name,
last_value(n) over (partition by name order by name) as n,
row_number() over (partition by name order by name) as rowno
 from sql1, sql2 where sql1.n = sql2.n_us and (sql2.opt like '%x%' or sql2.opt like '%y%' or sql2.opt like '%z%')
) where rowno = 1 order by n;


Выдача:
N	NAME
2	Алексей
3	Иван
5	Василий
12 ноя 19, 08:16    [22014096]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить