有没有办法在postgres中进行级联选择

时间:2014-03-11 09:51:36

标签: database postgresql cascade

我面临的情况是我有一个同一个表的外部引用字段,我需要获取这些外部引用的值列表。例如:

Field1 | Field2
----------------
X      |   Y
Y      |   Z
Z      |   A

现在我想级联选择Field2,因为我希望输出为{Y,Z,A}。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:3)

我认为SQL递归查询是您正在搜索的内容。它的语法如下:

WITH RECURSIVE <cte_name> (column, ...) AS (
<non-recursive_term>
UNION ALL
<recursive_term>)
SELECT ... FROM <cte_name>;

在您的情况下,它将如下所示:

  1. 创建表并填充它:

    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)
    
  2. 查询:

     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)
    
  3. 现在,只需使用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)
    

    如您所见,最后一行正是您想要的。

  4. 如果您想了解有关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

SQL FIddle sample