Мне нужна помощь по следующему SQL-запросу. Допустим, у нас есть table_1
с этими столбцами:
Если в столбце списка есть число, это означает, что существует список чисел, которые должны ссылаться на этот список. Ниже приведен снимок того, как должна выглядеть финальная таблица. Когда в поле клиента есть нулевое значение, это указывает на то, что есть список, этот номер списка вы можете найти клиентов в этом списке, когда число = список. Мне нужно изменить номер, чтобы сослаться на номер, которому принадлежит список.
Я пробовал с разными соединениями, но безуспешно:
SELECT *
FROM table_1
OUTER JOIN
(SELECT *
FROM TABLE_1
WHERE list IS NOT NULL) AS table_2 ON TABLE_1.list = table_2.list
Список 2 всегда будет принадлежать номеру 321, в этом смысле он уникален.
Итак, никаких цепочек, например, 321->2->456->12. Так проще :-)
Кстати, какая у вас СУБД? Вы всегда должны помечать свои SQL-запросы тегом используемой СУБД.
Использование BigQuery для этого
Я думаю, вам нужно изменить данные (DML). Вот пример:
DROP TABLE IF EXISTS customer_list
CREATE TABLE customer_list (
number INT,
Customer INT,
list INT
);
INSERT INTO customer_list (number, Customer, list)
VALUES
(321, 4514, NULL),
(321, NULL, 2),
(2, 5321, NULL),
(2, 5555, NULL);
UPDATE A
SET [number] = B.number
,[list] = b.list
FROM customer_list A
INNER JOIN customer_list B
ON A.number = B.list
WHERE B.Customer IS NULL
DELETE FROM customer_list
WHERE Customer IS NULL;
SELECT *
FROM customer_list
Если вам нужно только получить записи:
SELECT B.number
,A.customer
,B.List
FROM customer_list A
INNER JOIN customer_list B
ON A.number = B.list
WHERE B.Customer IS NULL
Эй, к сожалению, я не могу, так таблица существует в нашей базе данных, и это просто упрощенный фрагмент для демонстрационных целей.
@jontieez Вы хотите просто запрос SELECT, а не UPDATE?
Выбор предпочтительнее, если бы я мог сделать обновление из выбора?
Вы говорите, что это гарантированно будет только один уровень. Таким образом, у вас может быть 321->2, но не, скажем, 321->2->1.
Тогда, что ж, давайте присоединимся и покажем объединенный результат:
select
coalesce(ref.number, t1.number) as num,
t1.customer,
ref.list
from table_1 t1
left outer join table_1 ref on ref.list = t1.number
where t1.list is null;
Это произвело комбинацию всех клиентов; число всегда должно быть 321, а список = 2, когда в нем было 2 в качестве числа
Нет, он не объединяет всех клиентов. Он просто объединяет связанных клиентов, как в вашем примере. См.: dbfiddle.uk/eDr_hlsZ. Если у вас есть больше данных и вы хотите ограничить их до 321 и/или 2, добавьте это/эти условия в запрос.
Мне кажется, это иерархическая таблица. Вы показываете, что 321 принадлежит 2, но может ли само 2 снова принадлежать другому числу? Если да, то как должен выглядеть ваш результат?