在SQL中将一个查询的结果传递给另一个查询

在SQL中将一个查询的结果传递给另一个查询,sql,join,Sql,Join,我有两个问题: SELECT g.id FROM "group" g INNER JOIN group_role gr on g.id = gr.group_fk INNER JOIN role_details rd on rd.group_role_fk = gr.id INNER JOIN mandate m on m.role_details_fk = rd.id where m.id = x 及 我希望能够将g.id传递到第二个查询中,以便对于给定的“x”,返回p.id、p.name、

我有两个问题:

SELECT g.id FROM "group" g INNER JOIN group_role gr on g.id = gr.group_fk
INNER JOIN role_details rd on rd.group_role_fk = gr.id
INNER JOIN mandate m on m.role_details_fk = rd.id where m.id = x


我希望能够将g.id传递到第二个查询中,以便对于给定的“x”,返回p.id、p.name、g.name、g.id。我该怎么做?可以用更多的连接来完成吗

您可以像这样嵌套查询,称为子查询,假设两个查询都工作,并且子查询只返回一个值

SELECT p.id, p.name, g.name, g.id
FROM person p INNER JOIN position pos on p.id = pos.person_fk
INNER JOIN role_details rd on rd.id = pos.role_details_fk
INNER JOIN group_role gr on gr.id = rd.group_role_fk
INNER JOIN "group" g on g.id = gr.group_fk
WHERE g.id = (SELECT g.id FROM "group" g INNER JOIN group_role gr on g.id = gr.group_fk
INNER JOIN role_details rd on rd.group_role_fk = gr.id
INNER JOIN mandate m on m.role_details_fk = rd.id where m.id = x)

最简单的方法是使用子查询,如

SELECT p.id, p.name, g.name, g.id
FROM person p INNER JOIN position pos on p.id = pos.person_fk
INNER JOIN role_details rd on rd.id = pos.role_details_fk
INNER JOIN group_role gr on gr.id = rd.group_role_fk
INNER JOIN "group" g on g.id = gr.group_fk
WHERE g.id IN (SELECT g2.id FROM "group" g2 INNER JOIN group_role gr on g2.id = gr.group_fk
INNER JOIN role_details rd on rd.group_role_fk = gr.id
INNER JOIN mandate m on m.role_details_fk = rd.id where m.id = x)
请注意在子查询中使用不同的别名,除非您希望在外部查询中查找准确的行

为了避免子查询,您可以使用更多的联接重新格式化查询-可能使用不同的别名多次联接同一个表。根据DBMS的不同,这可能会为您带来一些性能

SELECT p.id, p.name, g.name, g.id
FROM person p INNER JOIN position pos on p.id = pos.person_fk
INNER JOIN role_details rd on rd.id = pos.role_details_fk
INNER JOIN group_role gr on gr.id = rd.group_role_fk
INNER JOIN "group" g on g.id = gr.group_fk
WHERE g.id IN (SELECT g2.id FROM "group" g2 INNER JOIN group_role gr on g2.id = gr.group_fk
INNER JOIN role_details rd on rd.group_role_fk = gr.id
INNER JOIN mandate m on m.role_details_fk = rd.id where m.id = x)