<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: How to solve the No Average Spanned Puzzle in SQL</title>
	<atom:link href="http://oraqa.com/2008/01/19/how-to-solve-the-no-average-spanned-puzzle-in-sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://oraqa.com/2008/01/19/how-to-solve-the-no-average-spanned-puzzle-in-sql/</link>
	<description>Oracle Question and Answer</description>
	<lastBuildDate>Mon, 19 Dec 2011 14:21:07 -0700</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: newkid</title>
		<link>http://oraqa.com/2008/01/19/how-to-solve-the-no-average-spanned-puzzle-in-sql/comment-page-1/#comment-289</link>
		<dc:creator>newkid</dc:creator>
		<pubDate>Tue, 29 Jun 2010 20:31:56 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2008/01/19/how-to-solve-the-no-average-spanned-puzzle-in-sql/#comment-289</guid>
		<description>Hi Frank, I finally understood your solution and rewrote it in 11GR2:
&lt;pre&gt;
WITH input AS
    (SELECT doc.extract(&#039;/l/text()&#039;).getNumberVal() n, count(*) over () cnt
     FROM
     TABLE(xmlSequence(extract(XMLType(&#039;&lt;doc&gt;&lt;l&gt;&#039;&#124;&#124;
     replace(:input_data,&#039;,&#039;,&#039;&lt;/l&gt;&lt;l&gt;&#039;)&#124;&#124;&#039;&lt;/l&gt;&lt;/doc&gt;&#039;),&#039;/doc/l&#039;))) doc
    )
,t2(n1,n2,n3,lvl) AS (
    SELECT n,0,0,1 FROM input
    UNION ALL
    SELECT t2.n1
          ,DECODE(lvl,1,input.n,t2.n2)
          ,DECODE(lvl,2,input.n,t2.n3)
          ,lvl+1
      FROM t2,input
     WHERE lvl&lt;3 AND input.n NOT IN (n1,n2)
    )
,b AS (SELECT n1,n2,n3 from t2 WHERE lvl=3 AND n2*2=n1+n3) 
,t(n,str,cnt,lvl,root) AS
    (SELECT n,&#039;,&#039;&#124;&#124;n&#124;&#124;&#039;,&#039;,cnt,1,n
       FROM input
     UNION ALL
     SELECT input.n,t.str&#124;&#124;input.n&#124;&#124;&#039;,&#039;,input.cnt,lvl+1,t.root
       FROM t,input
      WHERE lvl&lt;input.cnt
            AND INSTR(str,&#039;,&#039;&#124;&#124;input.n&#124;&#124;&#039;,&#039;)=0 --- nocycle
            AND (lvl&lt;2 OR lvl&gt;=2 AND t.n*2 != input.n + root)
            AND NOT EXISTS
                (SELECT 1
                  FROM b
                 WHERE instr(t.str&#124;&#124;input.n&#124;&#124;&#039;,&#039;, &#039;,&#039;&#124;&#124;b.n2&#124;&#124;&#039;,&#039;) &gt; instr(t.str&#124;&#124;input.n&#124;&#124;&#039;,&#039;, &#039;,&#039;&#124;&#124;b.n1&#124;&#124;&#039;,&#039;) 
                   AND instr(t.str&#124;&#124;input.n&#124;&#124;&#039;,&#039;, &#039;,&#039;&#124;&#124;b.n3&#124;&#124;&#039;,&#039;) &gt; instr(t.str&#124;&#124;input.n&#124;&#124;&#039;,&#039;, &#039;,&#039;&#124;&#124;n2&#124;&#124;&#039;,&#039;) 
                   AND instr(t.str&#124;&#124;input.n&#124;&#124;&#039;,&#039;, &#039;,&#039;&#124;&#124;b.n1&#124;&#124;&#039;,&#039;) &gt; 0
                ) 
    )
SELECT trim(BOTH &#039;,&#039; FROM str) AS No_Avg_Spanned_str
  FROM t
 WHERE lvl=cnt;


NO_AVG_SPANNED_STR
-----------------------------
4,2,3,1
1,3,4,2
1,3,2,4
3,1,4,2
3,1,2,4
3,4,1,2
2,1,4,3
2,4,1,3
2,4,3,1
4,2,1,3

10 rows selected.
&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>Hi Frank, I finally understood your solution and rewrote it in 11GR2:</p>
<pre>
WITH input AS
    (SELECT doc.extract('/l/text()').getNumberVal() n, count(*) over () cnt
     FROM
     TABLE(xmlSequence(extract(XMLType('&lt;doc&gt;&lt;l&gt;'||
     replace(:input_data,',','&lt;/l&gt;&lt;l&gt;')||'&lt;/l&gt;&lt;/doc&gt;'),'/doc/l'))) doc
    )
,t2(n1,n2,n3,lvl) AS (
    SELECT n,0,0,1 FROM input
    UNION ALL
    SELECT t2.n1
          ,DECODE(lvl,1,input.n,t2.n2)
          ,DECODE(lvl,2,input.n,t2.n3)
          ,lvl+1
      FROM t2,input
     WHERE lvl&lt;3 AND input.n NOT IN (n1,n2)
    )
,b AS (SELECT n1,n2,n3 from t2 WHERE lvl=3 AND n2*2=n1+n3)
,t(n,str,cnt,lvl,root) AS
    (SELECT n,','||n||',',cnt,1,n
       FROM input
     UNION ALL
     SELECT input.n,t.str||input.n||',',input.cnt,lvl+1,t.root
       FROM t,input
      WHERE lvl&lt;input.cnt
            AND INSTR(str,','||input.n||',')=0 --- nocycle
            AND (lvl&lt;2 OR lvl&gt;=2 AND t.n*2 != input.n + root)
            AND NOT EXISTS
                (SELECT 1
                  FROM b
                 WHERE instr(t.str||input.n||',', ','||b.n2||',') &gt; instr(t.str||input.n||',', ','||b.n1||',')
                   AND instr(t.str||input.n||',', ','||b.n3||',') &gt; instr(t.str||input.n||',', ','||n2||',')
                   AND instr(t.str||input.n||',', ','||b.n1||',') &gt; 0
                )
    )
SELECT trim(BOTH ',' FROM str) AS No_Avg_Spanned_str
  FROM t
 WHERE lvl=cnt;

NO_AVG_SPANNED_STR
-----------------------------
4,2,3,1
1,3,4,2
1,3,2,4
3,1,4,2
3,1,2,4
3,4,1,2
2,1,4,3
2,4,1,3
2,4,3,1
4,2,1,3

10 rows selected.
</pre>
]]></content:encoded>
	</item>
</channel>
</rss>

