SQL результат подзапроса в ГДЕ - PullRequest
0 голосов
/ 17 января 2020

У меня есть Paths таблица со столбцами PathID (уникальная) и PathStr.

Я хотел бы получить все PathStr записей в этой таблице, которые начинаются со строки, пришли из выбранного PathID.

Другими словами, я хотел бы получить все подпапки папки, если знаю PathID папки root.

Пример таблицы:

PathID | PathStr
-------+------------------------
   1   |  D:\Project1
   2   |  D:\Project1\Sub1   
   3   |  D:\Project1\Sub1\Sub11
   4   |  D:\Project2
   5   |  D:\Project2\Sub1

Требуемый результат, если PathID = 1:

D:\Project1
D:\Project1\Sub1
D:\Project1\Sub1\Sub11

Мой запрос выглядит сейчас так, но я застрял с подзапросом в WHERE:

SELECT P.PathStr As 'Folder'
FROM Paths AS P
WHERE P.PathStr LIKE (SELECT Paths.PathStr FROM Paths WHERE Paths.PathID = 1) + "%"

Я думаю, я не могу просто объединить результат подзапроса со строкой, но я не знаю, как я могу это сделать, я не нашел решения с моим другом google:)

Результатом подзапроса всегда является одна запись.

Спасибо

1 Ответ

1 голос
/ 17 января 2020

Я бы предложил вместо этого использовать exists:

SELECT p.PathStr as Folder
FROM Paths p
WHERE EXISTS (SELECT 1
              FROM Paths p2 
              WHERE p2.PathId = 1 AND
                    p.PathStr LIKE CONCAT(p2.PathStr, '%')
             );

Вы не отметили свою базу данных. Стандартный оператор для объединения строк - ||, и многие базы данных также поддерживают функцию CONCAT(). Использование + для конкатенации строк весьма ограничено.

РЕДАКТИРОВАТЬ:

Чтобы исправить проблему, упомянутую в комментарии:

SELECT p.PathStr as Folder
FROM Paths p
WHERE EXISTS (SELECT 1
              FROM Paths p2 
              WHERE p2.PathId = 1 AND
                    CONCAT(p.PathStr, '\') LIKE CONCAT(p2.PathStr, '\%')
             );

Примечание: в некоторых базах данных Backsla sh нужно будет удвоить, чтобы он не был escape-символом.

...