PostgreSQL 9.0.4ʸ�� | ||||
---|---|---|---|---|
前のページ | 巻戻し | 第 7章�䤤��碌 | 早送り | 次のページ |
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���Ǥ������Τ褦���䤤��碌�ϰʲ��Τ褦�˼¹Ԥ���ޤ���
�Ƶ�Ū�䤤��碌��ɾ��
��Ƶ�Ūɽ����ɾ�����ޤ���UNION�ʤ�����UNION ALL�ǤϤ���ޤ���ˤ��Ф�����ʣ�Ԥ��Ѵ����ޤ������κƵ�Ū�䤤��碌�η�̤λĤäƤ������ƤιԤ�������ߡ�Ʊ���ˤ��������Ū��ȥơ��֥����֤��ޤ���
��ȥơ��֥뤬���Ǥʤ��ΤǤ���Ф����μ����֤��ޤ���
�Ƶ����ʻ��Ȥ��Ф����ȥơ��֥�μ¹�������Ƥ��ִ������Ƶ�Ūɽ����ɾ�����ޤ���UNION�ʤ�����UNION ALL�ǤϤʤ��ˤ��Ф�����ʣ�Ԥ����η�̹ԤȽ�ʣ����Ԥ��˴����ޤ������κƵ�Ū�䤤��碌�η�̤λĤäƤ������ƤιԤ�������ߡ�Ʊ���ˤ��������Ū��֥ơ��֥����֤��ޤ���
��֥ơ��֥�����ƤǺ�ȥơ��֥�����Ƥ��ؤ�����֥ơ��֥����ˤ��ޤ���
注意: ��̩�ˤϡ����μ���ȿ���Ǥ��äƺƵ��ǤϤ���ޤ���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�䤤��碌�ϰ���Ū�ˡ����䤤��碌������˴�����Ǥ������Ԥ����������ˡ��줿�̤��ɾ������ޤ����ʤ���������ǽҤ٤��褦�ˡ��䤤��碌�λ��Ȥ����ꤵ�줿���ιԤΤߤ��᤹���硢ɾ�����������ߤ��ޤ�����