У меня есть таблица, содержащая идентификатор клиента и идентификатор заказа. Мне нужно найти разные идентификаторы клиентов с одинаковым идентификатором заказа, которые должны выглядеть следующим образом. В этом случае 12455 и 12454 соответствуют одному и тому же идентификатору заказа 4070, 4077.
Мне нужен такой запрос, если я выберу
select * from table where cust_id in (12455, 12454) ... query continues
вывод должен выглядеть так, как показано ниже, потому что 4070 и 4077 являются общими для данных идентификаторов cust.
если я выберу select * from table where cust_id in (12454,12455,12453) ... query continues
, вывод должен быть пустым.
Нет, мне нужно найти идентификаторы заказов, соответствующие 12454 и 12455. Например, если был идентификатор заказа с 12453 и не было идентификатора заказа, соответствующего 12454, 12455, и если я хотел выбрать 12454, 12455 и 12453, выходные данные должны быть пустыми. . В случае, который я вам показывал, можете подумать, что я выбрал 12454 и 12455.
Можете ли вы опубликовать свой код, что вы пробовали?
почему вывод во втором запросе должен быть пустым?
Почему не появляются 1928, 2659 и 2012? Возможно, логика: вернуть OrderID
туда, где это OrderID
присутствует для всех указанных CustID
?
@Charlieface, потому что эти номера заказов не разглашаются обоим пользователям.
Не могли бы вы отметить СУБД, которую вы используете?
Это должно сработать
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)
Обновление 1. Проверьте случай, когда пара (cust_id, order_id) имеет дубликаты.
Этот ответ неверен, потому что вы не принимаете во внимание часть shared
. См. dbfiddle.uk/H_qnCHyp, где между 12454 и 12455 нет ничего общего.
ЭргестБаша, Ваш комментарий верен. Я добавлю проверку.
Ответ @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)
, то результат будет:
и если :customer_id_list
равно number_list(12455, 12454, 12453)
, то строки не выводятся.
Хороший ответ. Обратите внимание, что типы TVP или коллекций/списков зависят от СУБД, но не все их поддерживают. Если предположить, что CUST_ID, ORDER_ID
— уникальный набор, то COUNT(DISTINCT CUST_ID)
может быть COUNT(*)
.
@Charlieface ОП отредактировал вопрос, пометив его Oracle.
Да, правда, я просто указал, что это зависит от СУБД, если кто-то захочет повторно использовать этот ответ.
Для подтверждения: вывод — это order_ids с более чем одним cust_id?