SQL, соединяющий столбцы одной и той же таблицы

Мне нужна помощь по следующему SQL-запросу. Допустим, у нас есть table_1 с этими столбцами:

число Клиент список 321 4514 321 2 2 5321 2 5555

Если в столбце списка есть число, это означает, что существует список чисел, которые должны ссылаться на этот список. Ниже приведен снимок того, как должна выглядеть финальная таблица. Когда в поле клиента есть нулевое значение, это указывает на то, что есть список, этот номер списка вы можете найти клиентов в этом списке, когда число = список. Мне нужно изменить номер, чтобы сослаться на номер, которому принадлежит список.

число Клиент список 321 4514 321 5321 2 321 5555 2

Я пробовал с разными соединениями, но безуспешно:

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

Мне кажется, это иерархическая таблица. Вы показываете, что 321 принадлежит 2, но может ли само 2 снова принадлежать другому числу? Если да, то как должен выглядеть ваш результат?

Thorsten Kettner 02.02.2023 08:01

Список 2 всегда будет принадлежать номеру 321, в этом смысле он уникален.

jontieez 02.02.2023 08:06

Итак, никаких цепочек, например, 321->2->456->12. Так проще :-)

Thorsten Kettner 02.02.2023 08:12

Кстати, какая у вас СУБД? Вы всегда должны помечать свои SQL-запросы тегом используемой СУБД.

Thorsten Kettner 02.02.2023 08:50

Использование BigQuery для этого

jontieez 02.02.2023 08:54
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вам нужно изменить данные (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 02.02.2023 07:43

@jontieez Вы хотите просто запрос SELECT, а не UPDATE?

gotqn 02.02.2023 07:48

Выбор предпочтительнее, если бы я мог сделать обновление из выбора?

jontieez 02.02.2023 07:55
Ответ принят как подходящий

Вы говорите, что это гарантированно будет только один уровень. Таким образом, у вас может быть 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 в качестве числа

jontieez 02.02.2023 08:43

Нет, он не объединяет всех клиентов. Он просто объединяет связанных клиентов, как в вашем примере. См.: dbfiddle.uk/eDr_hlsZ. Если у вас есть больше данных и вы хотите ограничить их до 321 и/или 2, добавьте это/эти условия в запрос.

Thorsten Kettner 02.02.2023 08:49

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