Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ / 7 сообщений из 7, страница 1 из 1
23.06.2017, 10:51
    #39476624
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
помогите составить одним запросом такую логику

если в таблице Б нет ни одного совпадения с А то из А выводим все записи
Код: sql
1.
2.
3.
with a(a) as (values(1,2,4,5)),
b as (values(6,7,8))
select ?


результат 1,2,4,5
если Б есть совпадения с А то только те значения из А которые встречаются в Б:
Код: sql
1.
2.
3.
with a(a) as (values(1,2,4,5)),
b as (values(1,4,6,7,8))
select ?


в таком случае результат 1, 4

чуствую что просто, но на удивление уже пол часа туплю(
...
Рейтинг: 0 / 0
23.06.2017, 11:04
    #39476635
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
Legushka,

как вариант:

Код: sql
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.
with a(a) as (SELECT unnest('{1,2,4,5}'::INTEGER[])),
b(b) as (SELECT unnest('{6,7,8}'::INTEGER[])),
existing(e) AS (
  SELECT 
    a.a
  FROM
    a INNER JOIN b
    ON a.a = b.b
)

SELECT 
  e.e
FROM 
  existing AS e

UNION ALL

SELECT 
  a.a
FROM 
  a
WHERE
  NOT EXISTS (
    SELECT 1
    FROM
      existing
  )
...
Рейтинг: 0 / 0
23.06.2017, 11:36
    #39476663
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
Lonepsycho, спасибо ваш способ работает-)
...
Рейтинг: 0 / 0
23.06.2017, 13:26
    #39476737
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
Код: sql
1.
2.
3.
4.
5.
with a(val) as (values (1), (2), (4), (5))
, b(val) as (values (6), (7), (8))
, c as (select a, b.val as b_val, count(b.val) over() as count_b_val
    from a natural left outer join b)
select (a).* from c where b_val is not null or count_b_val = 0;
...
Рейтинг: 0 / 0
23.06.2017, 14:05
    #39476757
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
LeXa NalBat,

спасибо работает
немного переписал ваш вариант, что бы небыло union и CTE)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select val from (
    SELECT
        a.val,
        b_val,
        max(b_val) OVER () AS b_val_max,
        max(count_b_val) OVER () AS count_b_val_max
    FROM (VALUES (1), (2), (4), (5)) a(val)
        LEFT JOIN (values(1), (4), (8)) b(val) ON b.val = a.val
        JOIN LATERAL (SELECT a.val, b.val AS b_val, count(b.val) OVER () AS count_b_val) c ON TRUE
    )t
where b_val is not null or count_b_val_max = 0
...
Рейтинг: 0 / 0
23.06.2017, 14:54
    #39476784
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
Legushka,

а зачем ?
или планами потрясти можете ?
для изрядных наборов

посмотрите ,
у меня побеждает вариант лонга


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with a(a) as (SELECT generate_series(1, 1000))
, b(b) as (SELECT generate_series(1001, 2000))
,existing(e) AS (
SELECT	a.a
FROM	a INNER JOIN b
	ON a.a = b.b
)

SELECT	e.e
FROM	existing AS e

UNION ALL

SELECT	a.a
FROM	a
WHERE
	NOT EXISTS (
	SELECT 1
	FROM
	  existing
  )

...
Рейтинг: 0 / 0
23.06.2017, 15:03
    #39476790
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
в проекте реализовал вариант Lonepsycho-)
остальные варианты для экспериментов
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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