Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
KtoYa Member Откуда: Сообщений: 8 |
Добрый день. Столкнулся с такой задачей. Условно есть две связанные таблицы 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] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
|
||||
31 окт 19, 12:18 [22007026] Ответить | Цитировать Сообщить модератору |
KtoYa Member Откуда: Сообщений: 8 |
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] Ответить | Цитировать Сообщить модератору |
KtoYa Member Откуда: Сообщений: 8 |
-2-, Пытался, закладывая внутрь, помимо условия равенства номеров еще IN(x,y,z), однако не получается почему то. |
31 окт 19, 13:01 [22007068] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
|
||
31 окт 19, 13:12 [22007082] Ответить | Цитировать Сообщить модератору |
Vadim Lejnin Member Откуда: Сообщений: 7208 |
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] Ответить | Цитировать Сообщить модератору |
yvprod Member Откуда: Сообщений: 24 |
KtoYa, exists
Сообщение было отредактировано: 31 окт 19, 14:46 |
31 окт 19, 14:45 [22007218] Ответить | Цитировать Сообщить модератору |
dimyaz Member Откуда: Сообщений: 442 |
KtoYa, Если в одной из таблиц клиенты уникальные, то можно через exists |
31 окт 19, 14:52 [22007231] Ответить | Цитировать Сообщить модератору |
KtoYa Member Откуда: Сообщений: 8 |
Спасибо за участие. Нашёл ошибку. В начале джойнил сразу вторую таблицу (в которой содержаться указатели x,y,z), поэтому, при использовании exists и размещение внутри него ссылки на первую таблицу (юзеры) запросы дублировались. |
31 окт 19, 16:09 [22007329] Ответить | Цитировать Сообщить модератору |
artas Member Откуда: Киев сити Сообщений: 1079 |
group by по всем полям |
||
1 ноя 19, 15:27 [22008202] Ответить | Цитировать Сообщить модератору |
microbash Member Откуда: Сообщений: 165 |
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] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
|
||||
12 ноя 19, 07:07 [22014086] Ответить | Цитировать Сообщить модератору |
microbash Member Откуда: Сообщений: 165 |
Можно даже и номер добавить, только задать критерий выбора из одинаковых имен, например первую запись или последнюю.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 | ![]() |