Выберите строки со ссылкой на другие строки в той же таблице - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть таблица foo со следующей структурой:

| id | docId  | content | parentId |
|----|--------|---------|----------|
| 1  | 19     | ...     | NULL     |
| 2  | 20     | ...     | NULL     |
| 3  | 20     | ...     | NULL     |
| 4  | NULL   | ...     | 3        |
| 5  | 20     | ...     | NULL     |
| 6  | NULL   | ...     | 5        |
| 7  | 21     | ...     | NULL     |
| 8  | NULL   | ...     | 7        |
| 9  | NULL   | ...     | 7        |

Я хочу выбрать все с помощью docId = 20 или с parentId, который соответствует строке с docId = 20.

Я думал, что доберусь туда, используя левое соединение, но не повезло:

SELECT * FROM foo a
LEFT JOIN foo b ON b.id = a.parentId
WHERE a.docId = 20

Возвращает все строки, где docId = 20, но не те, где docId = NULL, а parentId - это строка с docId 20.

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Я думаю

    SELECT * 
    FROM foo
    WHERE docId = 20
    UNION
    SELECT b.* 
    FROM foo a
    JOIN foo b ON a.id = b.parentId
    WHERE a.docId = 20

отвечает на ваш вопрос о родителях, если вы хотите, чтобы бабушка с дедушкой и другие предки, вы можете рассмотреть рекурсивные CTE.

0 голосов
/ 12 сентября 2018

Я решил это, используя подзапрос вместо JOIN:

SELECT * FROM foo
WHERE parentId IN (SELECT id FROM foo WHERE docId = 20)
OR docId = 20
0 голосов
/ 12 сентября 2018

Я думаю, что вы ошиблись в своем правиле соединения,
Я считаю, что вы должны использовать a.id = b.parentId, а не b.id = a.parentId, например:

SELECT * FROM foo a
LEFT JOIN foo b ON a.id = b.parentId
WHERE a.docId = 20
0 голосов
/ 12 сентября 2018

можно попробовать союз

SELECT * FROM foo a
LEFT JOIN foo b ON b.id = a.parentId
WHERE a.docId = 20    
UNION 
SELECT * FROM foo
WHERE docId = 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...