<?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 find matched rows between 2 tables based on required matching criteria in a SQL statement</title>
	<atom:link href="http://oraqa.com/2007/06/24/how-to-find-matched-rows-between-2-tables-based-on-required-matching-criteria-in-a-sql-statement/feed/" rel="self" type="application/rss+xml" />
	<link>http://oraqa.com/2007/06/24/how-to-find-matched-rows-between-2-tables-based-on-required-matching-criteria-in-a-sql-statement/</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/2007/06/24/how-to-find-matched-rows-between-2-tables-based-on-required-matching-criteria-in-a-sql-statement/comment-page-1/#comment-295</link>
		<dc:creator>newkid</dc:creator>
		<pubDate>Mon, 05 Jul 2010 20:37:46 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/2007/06/24/how-to-find-matched-rows-between-2-tables-based-on-required-matching-criteria-in-a-sql-statement/#comment-295</guid>
		<description>&lt;pre&gt;
WITH  d AS (SELECT t1.pk pk1,t2.pk pk2,DENSE_RANK() OVER (ORDER BY t1.pk) rn,COUNT(DISTINCT t1.pk) OVER() cnt
             FROM t1,t2
            WHERE t2_compare BETWEEN t1_compare-2 AND t1_compare+2
            )
    , m AS (SELECT pk1,pk2,rn,cnt FROM d
             UNION ALL
            SELECT DISTINCT pk1,NULL,rn,cnt FROM d
           )
,t(rn,match_path,match_cnt,cnt) AS (
SELECT rn,TO_CHAR(pk1)&#124;&#124;&#039;-&#039;&#124;&#124;TO_CHAR(pk2),(CASE WHEN m.pk2 IS NULL THEN 0 ELSE 1 END),cnt
  FROM m 
 WHERE rn=1
UNION ALL
SELECT m.rn,t.match_path&#124;&#124;&#039;,&#039;&#124;&#124;m.pk1&#124;&#124;&#039;-&#039;&#124;&#124;m.pk2,t.match_cnt + (CASE WHEN m.pk2 IS NULL THEN 0 ELSE 1 END),t.cnt
  FROM t,m
 WHERE t.rn&lt;t.cnt
       AND t.rn+1=m.rn
       AND INSTR(match_path&#124;&#124;&#039;,&#039;,&#039;-&#039;&#124;&#124;m.pk2&#124;&#124;&#039;,&#039;)=0
)
SELECT match_path FROM (SELECT t.*,RANK() OVER(ORDER BY match_cnt DESC) rnk FROM T ) WHERE rnk=1;


MATCH_PATH
--------------------------------
1-2,2-1,3-4,4-3,5-6,6-5
1-1,2-3,3-2,4-4,5-5,6-6
1-1,2-2,3-3,4-4,5-5,6-6
1-2,2-1,3-3,4-4,5-5,6-6
1-1,2-2,3-4,4-3,5-5,6-6
1-2,2-1,3-4,4-3,5-5,6-6
1-1,2-3,3-2,4-4,5-6,6-5
1-1,2-2,3-3,4-4,5-6,6-5
1-2,2-1,3-3,4-4,5-6,6-5
1-1,2-2,3-4,4-3,5-6,6-5

10 rows selected.
&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<pre>
WITH  d AS (SELECT t1.pk pk1,t2.pk pk2,DENSE_RANK() OVER (ORDER BY t1.pk) rn,COUNT(DISTINCT t1.pk) OVER() cnt
             FROM t1,t2
            WHERE t2_compare BETWEEN t1_compare-2 AND t1_compare+2
            )
    , m AS (SELECT pk1,pk2,rn,cnt FROM d
             UNION ALL
            SELECT DISTINCT pk1,NULL,rn,cnt FROM d
           )
,t(rn,match_path,match_cnt,cnt) AS (
SELECT rn,TO_CHAR(pk1)||'-'||TO_CHAR(pk2),(CASE WHEN m.pk2 IS NULL THEN 0 ELSE 1 END),cnt
  FROM m
 WHERE rn=1
UNION ALL
SELECT m.rn,t.match_path||','||m.pk1||'-'||m.pk2,t.match_cnt + (CASE WHEN m.pk2 IS NULL THEN 0 ELSE 1 END),t.cnt
  FROM t,m
 WHERE t.rn&lt;t.cnt
       AND t.rn+1=m.rn
       AND INSTR(match_path||',','-'||m.pk2||',')=0
)
SELECT match_path FROM (SELECT t.*,RANK() OVER(ORDER BY match_cnt DESC) rnk FROM T ) WHERE rnk=1;

MATCH_PATH
--------------------------------
1-2,2-1,3-4,4-3,5-6,6-5
1-1,2-3,3-2,4-4,5-5,6-6
1-1,2-2,3-3,4-4,5-5,6-6
1-2,2-1,3-3,4-4,5-5,6-6
1-1,2-2,3-4,4-3,5-5,6-6
1-2,2-1,3-4,4-3,5-5,6-6
1-1,2-3,3-2,4-4,5-6,6-5
1-1,2-2,3-3,4-4,5-6,6-5
1-2,2-1,3-3,4-4,5-6,6-5
1-1,2-2,3-4,4-3,5-6,6-5

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

