¾�ΥС�������ʸ�� �� 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

7.8. WITH�䤤��碌�ʶ��̥ơ��֥뼰��

WITH�ϡ�����礭��SELECT�䤤��碌�ǻ��Ѥ�������䤤��碌�򵭽Ҥ�����ˡ���󶡤��ޤ��� ���䤤��碌�ϡ����Ф��ж��̥ơ��֥뼰���ʤ��CTE�ȸƤФ�ޤ����������䤤��碌�Τߤ�¸�ߤ������ơ��֥����������Τȹͤ����ޤ��� ���������Σ��Ĥλ���ˡ�ϡ�ʣ�����䤤��碌����ñ������ʤ�ʬ�򤹤뤳�ȤǤ��� ��򼨤��ޤ���

WITH regional_sales AS (
        SELECT region, SUM(amount) AS total_sales
        FROM orders
        GROUP BY region
     ), top_regions AS (
        SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
     )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

������ϰ��region������ȥåפΤߤ�Ⱦ���ʤ������ɽ�����ޤ���������� WITH�ʤ��Ǥ⵭�ҤǤ��ޤ��������ؤ�����Ҥ���SELECT��ɬ�פȤ��ޤ���������ˡ�˽����ۤ���¿�������䤹���Ǥ���

���ץ�����RECURSIVE�����Ҥϡ�WITH��ñ�˹�ʸ����������ι�������Ǥʤ�ɸ��Ū��SQL�Ǥ��Բ�ǽ�ʵ�ǽ��¸������ޤ���RECURSIVE����Ѥ���С�WITH�䤤��碌���Ԥä����ʤη�̤򻲾ȤǤ���褦�ˤʤ�ޤ���1����100�ޤǤο����פ�������ñ����䤤��碌�ϰʲ��Τ褦�ʤ�ΤǤ���

WITH RECURSIVE t(n) AS (
    VALUES (1)
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;

����Ƶ�ŪWITH�䤤��碌�����ѷ����ϡ������Ƶ�Ūɽ����non-recursive term����������UNION�ʤޤ���UNION ALL�ˡ������� �Ƶ�Ūɽ���˸¤äƤ����䤤��碌���Ȥν��ϻ��Ȥ�ޤळ�Ȥ��Ǥ����Ƶ�Ūɽ����recursive term���Ǥ������Τ褦���䤤��碌�ϰʲ��Τ褦�˼¹Ԥ���ޤ���

�Ƶ�Ū�䤤��碌��ɾ��

  1. ��Ƶ�Ūɽ����ɾ�����ޤ���UNION�ʤ�����UNION ALL�ǤϤ���ޤ���ˤ��Ф�����ʣ�Ԥ��Ѵ����ޤ������κƵ�Ū�䤤��碌�η�̤λĤäƤ������ƤιԤ�������ߡ�Ʊ���ˤ��������Ū��ȥơ��֥����֤��ޤ���

  2. ��ȥơ��֥뤬���Ǥʤ��ΤǤ���Ф����μ��򷫤��֤��ޤ���

    1. �Ƶ����ʻ��Ȥ��Ф����ȥơ��֥�μ¹�������Ƥ��ִ������Ƶ�Ūɽ����ɾ�����ޤ���UNION�ʤ�����UNION ALL�ǤϤʤ��ˤ��Ф�����ʣ�Ԥ����η�̹ԤȽ�ʣ����Ԥ��˴����ޤ������κƵ�Ū�䤤��碌�η�̤λĤäƤ������ƤιԤ�������ߡ�Ʊ���ˤ��������Ū��֥ơ��֥����֤��ޤ���

    2. ��֥ơ��֥�����ƤǺ�ȥơ��֥�����Ƥ򺹤��ؤ�����֥ơ��֥����ˤ��ޤ���

注意: ��̩�ˤϡ����μ���ȿ���Ǥ��äƺƵ��ǤϤ���ޤ��󤬡�RECURSIVE��SQLɸ�ಽ�Ѱ�������Ф줿�Ѹ�Ǥ���

�嵭����ǡ���ȥơ��֥�Ϥ��줾��μ��Ǥ�ñ�ʤ�ñ��Ԥǡ�����³����Ȥ�1����100�֤Ǥ��ͤ�������ޤ���100���ܤκ�Ȥǡ�WHERE��ˤ����Ϥ�̵���ʤꡢ�䤤��碌����λ���ޤ���

�Ƶ�Ū�䤤��碌�ϳ���Ū���ޤ��ϥĥ꡼��¤�ǡ������н褹�뤿�����Ū�˻��Ѥ���ޤ�������Ū����ϡ�ľ������򼨤��ơ��֥룱�ĤΤߤ�Ϳ����졢���ʤ��٤Ƥ�ľ�ܡ��������ʤ򸫤Ĥ����䤤��碌�Ǥ���

WITH RECURSIVE included_parts(sub_part, part, quantity) AS (
    SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product'
  UNION ALL
    SELECT p.sub_part, p.part, p.quantity
    FROM included_parts pr, parts p
    WHERE p.part = pr.sub_part
  )
SELECT sub_part, SUM(quantity) as total_quantity
FROM included_parts
GROUP BY sub_part

�Ƶ�Ū�䤤��碌�򰷤���硢�䤤��碌�κƵ���ʬ�����Ȥ��ƥ��ץ���֤������ޤ����䤤��碌���ʵפ˥롼�פ���ȸ��ä����ȤΤʤ��褦�����դ��ޤ������ޤˤϡ�UNION ALL���ؤ���UNION����Ѥ�����ʣ��������ν��ϹԤ��Ѵ����뤳�Ȥǡ������¸��Ǥ��ޤ�������������������Ϥ��Ф��д����˽�ʣ���Ƥ�����ϹԤ��оݤȤ��ޤ���Ʊ����꤬������ã���줿���ɤ����򸫤뤿�ᡢ���ä����ĤΡ��ޤ��Ͽ��ե�����ɤ򸡺�����ɬ�פ����뤫�⤷��ޤ��󡣤��Τ褦�ʾ��֤��갷��ɸ���ˡ�ϡ����˽�󤵤줿�ͤ������׻����뤳�ȤǤ����㤨�С�link�ե�����ɤ�Ȥäƥơ��֥�graph�򸡺�����ʲ����䤤��碌��ͤ��Ƹ��ޤ���

WITH RECURSIVE search_graph(id, link, data, depth) AS (
        SELECT g.id, g.link, g.data, 1
        FROM graph g
      UNION ALL
        SELECT g.id, g.link, g.data, sg.depth + 1
        FROM graph g, search_graph sg
        WHERE g.id = sg.link
)
SELECT * FROM search_graph;

�����䤤��碌��link�ط���cycle��ޤ�Ǥ���Х롼�פ��ޤ���"depth"���Ϥ�ɬ�פʤΤǡ�UNION ALL �� UNION ���ѹ����롼�ײ������ʤ��褦�ˤ��ޤ����������ꡢ�����link��path�򤿤ɤäƤ���֡�Ʊ�������ã�������ɤ�����ǧ������ɬ�פ�����ޤ����롼�פ��䤹���䤤��碌�ˡ�path �� cycle �Σ����ä��ޤ���

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
        SELECT g.id, g.link, g.data, 1,
          ARRAY[g.id],
          false
        FROM graph g
      UNION ALL
        SELECT g.id, g.link, g.data, sg.depth + 1,
          path || g.id,
          g.id = ANY(path)
        FROM graph g, search_graph sg
        WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;

����ɻߤ��̤Ȥ��ơ������ͤ�"path"���ɤ������Ԥ���ã��������ɽ���Ȥ��Ƥθ��������餷�Ф������Ѳ��ͤ�����ޤ���

����cycle��ǧ�����뤿��˸������ʤ��ƤϤʤ�ʤ����İʾ�Υե�����ɤ�ɬ�פȤ�������Ū�ʾ�硢�Ԥ��������Ѥ��ޤ����㤨�С�f1 �� f2 �Υե�����ɤ���Ӥ���ɬ�פ�����Ȥ��ϼ��Τ褦�ˤ��ޤ���

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
        SELECT g.id, g.link, g.data, 1,
          ARRAY[ROW(g.f1, g.f2)],
          false
        FROM graph g
      UNION ALL
        SELECT g.id, g.link, g.data, sg.depth + 1,
          path || ROW(g.f1, g.f2),
          ROW(g.f1, g.f2) = ANY(path)
        FROM graph g, search_graph sg
        WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;

ティップ: cycle��ǧ�����뤿��˸������ʤ���Фʤ�ʤ����Ĥ����Υե�����ɤ�ɬ�פȤ�������Ū�ʾ�硢ROW()��ʸ�������ޤ�������ǡ�ʣ�緿����ǤϤʤ�ñ����������졢��Ψ��夬��ޤ���

ティップ: �Ƶ�Ū�䤤��碌ɾ�����르�ꥺ��ϡ�����������ǤΤ��ν��Ϥ�������ޤ������Τ褦�ˤ��ƺ��줿"path"���¦�䤤��碌��ORDER BY�����ķ�������η�̤�ɽ������ǽ�Ǥ���

�롼�פ��뤫�ɤ����ο������Ƥʤ��䤤��碌��ƥ��Ȥ���ͭ�פ�����Ȥ��ơ����䤤��碌��LIMIT�����֤��ޤ����㤨�С��ʲ����䤤��碌��LIMIT̵���Ǥϱʵץ롼�פ��ޤ���

WITH RECURSIVE t(n) AS (
    SELECT 1
  UNION ALL
    SELECT n+1 FROM t
)
SELECT n FROM t LIMIT 100;

���줬ư���Τϡ�PostgreSQL�μ��������ºݤ˿��䤤��碌�Ǽ��Ф����Τ�Ʊ������WITH�䤤��碌�ιԤΤߤ�ɾ�����뤫��Ǥ������������²�ư�Ķ��ǻ��Ѥ��뤳�Ȥϴ�����ޤ��󡣤�����ͳ�ϡ�¾�Υ����ƥ�Ǥϰۤʤä�ư��򤹤��ǽ�������뤫��Ǥ���Ʊ���ˡ��⤷�����䤤��碌��Ƶ�Ū�䤤��碌�η�̤��¤��ؤ������ꡢ�ޤ��Ϥ�����¾�Υơ��֥�ȷ�礹��褦�ʽ����򤷤���硢ư��ޤ���

ͭ�Ѥ�WITH�䤤��碌�������ϡ����䤤��碌���⤷���Ϸ���WITH�䤤��碌�ˤ�ꤿ�Ȥ�����ʾ廲�Ȥ����Ȥ��Ƥ⡢���䤤��碌�¹ԤǤ��ä��������ɾ������뤳�ȤǤ������äơ�ʣ���ξ���ɬ�פʹ���ʷ׻��ϡ���Ĺ��Ȥ��ɻߤ��뤿��WITH�䤤��碌��������֤��뤳�Ȥ��Ǥ��ޤ���¾��ͭ�ꤦ�륢�ץꥱ�������Ȥ��Ƥϡ�˾�ޤ�ʤ������ѤΤ���ؿ���¿��ɾ�����򤱤뤳�ȤǤ������������Ųߤΰ�����¦�ǡ����ץƥ��ޥ�����ǽ�Ϥϡ����䤤��碌�����������̾�����䤤��碌�ǤϤʤ���WITH�䤤��碌�˲���������ˤϡ����äƤ��ޤ���WITH�䤤��碌�ϰ���Ū�ˡ����䤤��碌������˴�����Ǥ������Ԥ����������ˡ��񤫤줿�̤��ɾ������ޤ����ʤ���������ǽҤ٤��褦�ˡ��䤤��碌�λ��Ȥ����ꤵ�줿���ιԤΤߤ��׵᤹���硢ɾ�����������ߤ��ޤ�����