powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
7 сообщений из 7, страница 1 из 1
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
    #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
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
    #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
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
    #39476663
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsycho, спасибо ваш способ работает-)
...
Рейтинг: 0 / 0
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
    #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
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
    #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
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
    #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
запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
    #39476790
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в проекте реализовал вариант Lonepsycho-)
остальные варианты для экспериментов
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос из А выбрать все если нет ни одного совпадения с Б, либо только совпавшие строки АБ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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