Найдите разные идентификаторы, принадлежащие другому тому же идентификатору

Идентификатор клиента НОМЕР ЗАКАЗА 12455 4070 12454 4070 12454 4077 12455 4077 12454 2659 12455 1928 год 12454 2012 год 12453 1354

У меня есть таблица, содержащая идентификатор клиента и идентификатор заказа. Мне нужно найти разные идентификаторы клиентов с одинаковым идентификатором заказа, которые должны выглядеть следующим образом. В этом случае 12455 и 12454 соответствуют одному и тому же идентификатору заказа 4070, 4077.

Мне нужен такой запрос, если я выберу

select * from table where cust_id in (12455, 12454) ... query continues

вывод должен выглядеть так, как показано ниже, потому что 4070 и 4077 являются общими для данных идентификаторов cust.

НОМЕР ЗАКАЗА 4070 4077

если я выберу select * from table where cust_id in (12454,12455,12453) ... query continues, вывод должен быть пустым.

Для подтверждения: вывод — это order_ids с более чем одним cust_id?

Mureinik 10.06.2024 11:16

Нет, мне нужно найти идентификаторы заказов, соответствующие 12454 и 12455. Например, если был идентификатор заказа с 12453 и не было идентификатора заказа, соответствующего 12454, 12455, и если я хотел выбрать 12454, 12455 и 12453, выходные данные должны быть пустыми. . В случае, который я вам показывал, можете подумать, что я выбрал 12454 и 12455.

niimet 10.06.2024 11:25

Можете ли вы опубликовать свой код, что вы пробовали?

Roshan N 10.06.2024 11:26

почему вывод во втором запросе должен быть пустым?

Roshan N 10.06.2024 11:35

Почему не появляются 1928, 2659 и 2012? Возможно, логика: вернуть OrderID туда, где это OrderID присутствует для всех указанных CustID?

Charlieface 10.06.2024 11:35

@Charlieface, потому что эти номера заказов не разглашаются обоим пользователям.

pilchard 10.06.2024 11:38

Не могли бы вы отметить СУБД, которую вы используете?

SelVazi 10.06.2024 12:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
92
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Это должно сработать

select distinct cust_id 
from table 
where cust_id not in (<list of customer ids>)
and order_id in (
    select oder_id 
    from table 
    where cust_id in (<list of customer ids>))
Ответ принят как подходящий

Ваша логика не совсем ясна, но, похоже, это классическая проблема реляционного деления без остатка.

WITH IdsToSearch AS (
    SELECT *
    FROM (VALUES (12455), (12454) ) v(ID)
)
SELECT
  t.ORDERID
FROM YourTable t
JOIN IdsToSearch i ON i.ID = t.cust_id
GROUP BY
  t.ORDERID
HAVING COUNT(*) = (SELECT COUNT(*) FROM IdsToSearch);

Вы ищете заказы более чем на 1 клиента.
Подсчитайте количество клиентов для заказа и отберите тех, у которых count>1.

См. пример

select order_id
  , min(cust_id) cust_id1
  , max(cust_id) cust_id2
  ,count(*) cnt
from data
group by order_id
having count(*)>1
  and min(cust_id)<>max(cust_id)
номер заказа cust_id1 cust_id2 CNT 4070 12454 12455 2 4077 12454 12455 2

Демонстрационный пример

Обновление 1. Проверьте случай, когда пара (cust_id, order_id) имеет дубликаты.

Этот ответ неверен, потому что вы не принимаете во внимание часть shared. См. dbfiddle.uk/H_qnCHyp, где между 12454 и 12455 нет ничего общего.

Ergest Basha 10.06.2024 12:03

ЭргестБаша, Ваш комментарий верен. Я добавлю проверку.

ValNik 10.06.2024 15:02

Ответ @Charlieface великолепен. Вот альтернативное решение, которое также требует передачи общего количества клиентов:

SELECT ORDER_ID
FROM mytable 
WHERE CUST_ID in (12454, 12455, 12453)
GROUP BY ORDER_ID
HAVING COUNT(*) = 3 -- 3 is the total number of customers 

Демо здесь

Другой вариант — использовать подзапрос для получения общего количества использованных поисковых идентификаторов custId.

SELECT orderId
FROM myTable
WHERE custId IN (12455, 12454)
GROUP BY orderId
HAVING COUNT(DISTINCT custId) = (
    SELECT COUNT(DISTINCT custId)
    FROM myTable
    WHERE custId IN (12455, 12454)
);

Смотрите пример

Если у вас есть тип коллекции:

CREATE TYPE number_list IS TABLE OF NUMBER;

Затем вы можете передать список идентификаторов клиентов в качестве переменной привязки:

SELECT order_id
FROM   table_name
WHERE  cust_id MEMBER OF :customer_id_list
GROUP BY order_id
HAVING COUNT(DISTINCT cust_id) = CARDINALITY(:customer_id_list)

Что для примера данных:

CREATE TABLE table_name (CUST_ID, ORDER_ID) AS
SELECT 12455, 4070 FROM DUAL UNION ALL
SELECT 12454, 4070 FROM DUAL UNION ALL
SELECT 12454, 4077 FROM DUAL UNION ALL
SELECT 12455, 4077 FROM DUAL UNION ALL
SELECT 12454, 2659 FROM DUAL UNION ALL
SELECT 12455, 1928 FROM DUAL UNION ALL
SELECT 12454, 2012 FROM DUAL UNION ALL
SELECT 12453, 1354 FROM DUAL;

Если :customer_id_list равно number_list(12455, 12454), то результат будет:

НОМЕР ЗАКАЗА 4070 4077

и если :customer_id_list равно number_list(12455, 12454, 12453), то строки не выводятся.

рабочий пример

Хороший ответ. Обратите внимание, что типы TVP или коллекций/списков зависят от СУБД, но не все их поддерживают. Если предположить, что CUST_ID, ORDER_ID — уникальный набор, то COUNT(DISTINCT CUST_ID) может быть COUNT(*).

Charlieface 10.06.2024 12:49

@Charlieface ОП отредактировал вопрос, пометив его Oracle.

MT0 10.06.2024 12:51

Да, правда, я просто указал, что это зависит от СУБД, если кто-то захочет повторно использовать этот ответ.

Charlieface 10.06.2024 12:53

Другие вопросы по теме