Можем ли мы избежать вложенных запросов, когда таблицы уже объединены в SQL? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть две подобные таблицы: основная сущность и одна для представления статусов сущности, включая старые.

> entity
id, current_status_id

> status
id, entity_id, name

Я написал такой запрос, чтобы вернуть элементы сущности, которыев настоящее время имеет данный статус

SELECT e.* 
FROM entity e
INNER JOIN status s ON e.current_status_id = s.id
WHERE name = $some_status

Но скажем, я хочу добавить фильтр к этому запросу, который уже имеет соединение между Status и Entity.Например: если у него был другой статус в прошлом.

. Я бы добавил это в конец предыдущего запроса:

AND e.id IN (SELECT entity_id FROM status WHERE name = $another_status)

IИнтересно, если в таких ситуациях необходимо вложение запроса, так как эта таблица уже объединена.Есть ли ярлык или хорошая практика для этого?

Спасибо

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Вы должны использовать подзапрос или еще одно объединение, потому что вы пытаетесь получить два независимых подмножества status таблицы

SELECT e.* 
FROM entity e
INNER JOIN status s ON e.current_status_id = s.id
WHERE name = $some_status
    AND EXISTS (
        SELECT 1
        FROM status
        WHERE name = $another_status
        AND entity_id = e.id
)
0 голосов
/ 06 июня 2019

Вы можете использовать ту же таблицу, используя псевдоним

SELECT e.* 
FROM entity e
INNER JOIN status s1 ON e.current_status_id = s1.id  
    and  s1.name = $some_status
INNER JOIN status s2 ON e.current_status_id = s2.id  
    and  s2.name = $another_status
0 голосов
/ 06 июня 2019

Вы можете иметь несколько условий в ON предложении

SELECT e.* 
FROM entity e
INNER JOIN status s
  ON e.current_status_id = s.id
  AND s.name IN ('$some_status', '$another_status')

но он должен работать точно так же, как и в предложении where

SELECT * 
FROM entity e, status s
WHERE e.current_status_id = s.id
AND s.name IN ('$some_status', '$another_status')
...