#mysql #sql #database
#mysql #sql #База данных
Вопрос:
у меня есть столбцы таблицы один (idprocess), указывающие на столбцы два (idporcess1) и указывающие на дерево столбцов (idprocess2).
id idprocess idporcess1 idprocess2
1 15 16 17 <== A
2 15 16 19 <== B
3 15 20 23
4 14 16 17
6 16 15 80 <== C
7 17 15 49 <== D
8 23 16 20 <== E
Мне нужен SQL-запрос, который возвращает следующее: строка c и строка D, поэтому с номером idprocess(16) и idprocess(17)
потому что строка c: idprocess(16) снова ссылается на ipdprocess1(15), потому что строка c: idprocess(17) ссылается на ipdprocess1(15)
пожалуйста, помогите, я хочу только создать циклическую ссылку в дереве
Комментарии:
1. Что вы подразумеваете под «перестановкой»?
2. перестановка между столбцами (idprocess и iprocess1) и (idprocess и iprocess2)
3. Почему выбираются эти две строки? Ваши критерии неясны.
4. вау — трудно расшифровать .. я думаю, это означает иерархический запрос.
5. Вы пытаетесь определить циклические ссылки? Другими словами, idprocess 15 указывает на idprocess1 16, а idprocess 16 указывает на idprocess1 15.
Ответ №1:
Если вы рады найти строки, в которых первые два столбца переставлены, это сделает работу:
SELECT *
FROM my_tbl t
WHERE EXISTS (SELECT 1 FROM my_tbl t1 WHERE t1.idprocess = t.idprocess1 AND t1.idprocess1 = t.idprocess)
ORDER BY t.id;
Альтернативная интерпретация:
Если вы хотите, чтобы все строки, в которых idprocess1
было указано idprocess
ранее (before = меньший идентификатор), тогда вы можете:
SELECT *
FROM my_tbl t
WHERE EXISTS (SELECT 1 FROM my_tbl t1 WHERE t1.id < t.id AND t1.idprocess = t.idprocess1)
ORDER BY t.id;
Однако вы бы не назвали это «перестановкой».
Комментарии:
1. @AbdelillahFarka: в моей первой версии была ошибка, теперь она должна быть исправлена.
2. @AbdelillahFarka: Извините, я не понимаю. Если вам трудно выразить то, что вам нужно, пожалуйста, отредактируйте свой вопрос с помощью примера, который показывает точный результат, который вы ищете.
Ответ №2:
Вопрос немного неоднозначный, но я попытался разобраться в нем самостоятельно и подготовил следующий запрос:
SELECT *
FROM TEMP
where C2 IN ( Select C2 FROM TEMP group by C2 having count(C2) > 1 )
OR C3 IN ( Select C3 FROM TEMP group by C3 having count(C3) > 1 )