Использование одной и той же таблицы в предложении SELECT и WHERE - PullRequest
0 голосов
/ 11 апреля 2019

Простой кейс

У меня есть простая таблица, где один столбец - это PK другого элемента той же таблицы, как показано ниже:

    id     |  something   | parent_id
___________|______________|____________
     1     |   colors     |  null
     2     |   red        |  1
     3     |   green      |  1
     4     |   blue       |  1
    ...    |   ...        | ...

Задача

Я хотел получить все элементы, которые имеют parent_id элемента, соответствующего условию. Давайте предположим, что родительский элемент должен иметь something='colors'

Ожидаемый результат

    id     |  something   | parent_id
___________|______________|____________
     2     |   red        |  1
     3     |   green      |  1
     4     |   blue       |  1

После просмотра StackOverflow я попытался:

SELECT * FROM my_table WHERE 
   parent_id=(SELECT id FROM my_table WHERE something='colors')

а также:

SELECT * FROM my_table as t1 WHERE
   t1.parent_id=(SELECT id FROM my_table as t2 WHERE t2.something='colors')

но я получаю эту ошибку:

Ошибка: в синтаксисе SQL есть ошибка

Причиной была пропущенная ; в предыдущем файле, который был объединен перед моим. Вышеуказанные запросы работают ...


Это не моя область, и я знаю, что " решение " (? ) (, используемое другими в проекте ) может быть:

SELECT * FROM my_table WHERE 
    parent_id=(SELECT id FROM (SELECT * FROM my_table) AS t1 WHERE something='colors')

но мне это не очень нравится


Спасибо всем за помощь. Я знаю, что мы должны LIMIT 1 или использовать IN для предотвращения ошибок, я пытался максимально упростить синтаксис.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Вы можете сделать:

SELECT t.*
FROM table t
WHERE EXISTS(SELECT 1 FROM table t1 WHERE t1.id = t.parent_id AND t1.something = 'colors');
1 голос
/ 11 апреля 2019

Вы можете получить его с помощью простого JOIN:

SELECT T1.* FROM my_table AS T1 
JOIN my_table AS T2 ON T1.parent_id = T2.id
WHERE T2.something='colors';

Этот метод известен как SELF JOIN. Здесь для более подробной информации.

1 голос
/ 11 апреля 2019

использование существует

SELECT t1.* FROM table_name t1
WHERE EXISTS(SELECT 1 FROM table_name t2 WHERE t1.id=t2.parent_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...