Мне было интересно, возможно ли скомбинировать результат запроса?Self-join подзапроса
(я использую PostgreSQL)
Мне было интересно, возможно ли скомбинировать результат запроса?Self-join подзапроса
(я использую PostgreSQL)
Вы можете сделать это с WITH:
WITH subquery AS(
SELECT * FROM TheTable
)
SELECT *
FROM subquery q1
JOIN subquery q2 on ...
Или, создав представление, содержащее запрос, и соединение на что:
SELECT *
FROM TheView v1
JOIN TheView v2 on ...
Или подход грубой силы: введите подзапрос дважды:
SELECT *
FROM (
SELECT * FROM TheTable
) sub1
LEFT JOIN (
SELECT * FROM TheTable
) sub2 ON ...
PostgreSQL не поддерживает запросы в последней версии, 8.3, согласно http://www.postgresql.org/docs/8.3/interactive/unsupported-features-sql-standard.html. – markusk
Если вы можете обновить до 8.4, в настоящее время в бета-версии, WITH, наконец, там, см. Http://www.postgresql.org/docs/8.4/static/queries-with.html –
Так как мой подзапрос несколько сложный, я сначала попробуйте с представлением, затем с решением «грубой силы». В конце концов я переключусь на использование WITH при отправке pgsql 8.4 :) Большое спасибо всем! – Joril
Вы имеете в виду результат запроса по таблице в той же таблице. Если да, то да, это возможно ... например.
--Bit of a contrived example but...
SELECT *
FROM Table
INNER JOIN
(
SELECT
UserID, Max(Login) as LastLogin
FROM
Table
WHERE
UserGroup = 'SomeGroup'
GROUP BY
UserID
) foo
ON Table.UserID = Foo.UserID AND Table.Login = Foo.LastLogin
Извините, просто заметил ваш комментарий «Я использую PostGres». Не уверен, что вышеприведенное синтаксически корректно в postgres. –
Это прекрасная AFAICS (за исключением, возможно, для конфликта «foo» и «Foo» ;-). –
@Eoin: Ну, я имел в виду присоединение к _results_ запросов, но спасибо за вашу помощь все равно :) – Joril
Да, только псевдоним запросы:
SELECT *
FROM (
SELECT *
FROM table
) t1
JOIN (
SELECT *
FROM table
) t2
ON t1.column < t2.other_column
Не могли бы вы привести пример того, что вы пытаетесь сделать? –