我面临的情况是我有一个同一个表的外部引用字段,我需要获取这些外部引用的值列表。例如:
Field1 | Field2
----------------
X | Y
Y | Z
Z | A
现在我想级联选择Field2,因为我希望输出为{Y,Z,A}。
有没有办法实现这个目标?
答案 0 :(得分:3)
我认为SQL递归查询是您正在搜索的内容。它的语法如下:
WITH RECURSIVE <cte_name> (column, ...) AS (
<non-recursive_term>
UNION ALL
<recursive_term>)
SELECT ... FROM <cte_name>;
在您的情况下,它将如下所示:
创建表并填充它:
create table example (field1 char(1), field2 char(1));
insert into example values ('X', 'Y');
insert into example values ('Y', 'Z');
insert into example values ('Z', 'A');
select * from example;
结果:
field1 | field2
-------+--------
X | Y
Y | Z
Z | A
(3 rows)
查询:
WITH RECURSIVE linked_example(list, first, last) AS (
SELECT field1 || ', ' || field2, field1, field2 FROM example
UNION ALL
SELECT list || ', ' || field2, first, field2
FROM
linked_example, example
WHERE
last = field1
)
SELECT * from linked_example;
结果:
list | first | last
------------+-------+------
X, Y | X | Y
Y, Z | Y | Z
Z, A | Z | A
X, Y, Z | X | Z
Y, Z, A | Y | A
X, Y, Z, A | X | A
(6 rows)
现在,只需使用WHERE子句限制查询:
WITH RECURSIVE linked_example(list, first, last) AS (
SELECT field1 || ', ' || field2, field1, field2 FROM example
UNION ALL
SELECT list || ', ' || field2, first, field2
FROM
linked_example, example
WHERE
last = field1
)
SELECT * from linked_example WHERE first = 'Y';
结果:
list | first | last
---------+-------+------
Y, Z | Y | Z
Y, Z, A | Y | A
(2 rows)
如您所见,最后一行正是您想要的。
如果您想了解有关SQL递归查询的更多信息和示例,可以阅读我的两篇有关此主题的文章:
答案 1 :(得分:-1)
你可以简单地使用jonction来实现这个目标:
select a.field1, a.field2, b.field2
from my_table a
inner join my_table b
on a.field2 =b.field1