<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: The Unique Result Oracle Database Coding Challenge</title>
	<atom:link href="http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/feed/" rel="self" type="application/rss+xml" />
	<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/</link>
	<description>Miscellaneous Random Oracle Topics: Stop, Think, ... Understand</description>
	<lastBuildDate>Mon, 13 May 2013 14:10:06 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3790</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Mon, 15 Aug 2011 10:54:52 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3790</guid>
		<description><![CDATA[Stew,

Nice solutions - a bit of binary math in part 3.  :-)

It appears that Wordpress offers a standardized RSS feed address for all hosted blogs: blogname.wordpress.com/feed/rss/:
http://hoopercharles.wordpress.com/feed/rss/

My RSS feed only includes a small part of my articles for a variety of reasons.  It seems that various sites strive to be more than blog aggregators, and have a habit of either not identifying the original author of some articles (oraclecommunity.in.ua and www.oracle.cc/the-new-order-oracle-coding-challenge-3-%E2%80%93-mind-boggle.html seems to come to mind), make it appear that people are writing articles specifically for a site (itnewscast.com/database/new-order-oracle-coding-challenge-2 seems to come to mind), or attempt to charge people to read articles that the author makes freely readable (sswug.org seems to come to mind).  It is not uncommon for me (and I suspect several others who write technical blog articles) to spend several hours developing each article - limiting the RSS feed simply means that someone must make more of an effort to republish my articles without authorization.  
&lt;i&gt;(I have a much longer explanation why my RSS feed includes only partial articles, but this should be a sufficient explanation for now.&lt;/i&gt;]]></description>
		<content:encoded><![CDATA[<p>Stew,</p>
<p>Nice solutions &#8211; a bit of binary math in part 3.  <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>It appears that WordPress offers a standardized RSS feed address for all hosted blogs: blogname.wordpress.com/feed/rss/:<br />
<a href="http://hoopercharles.wordpress.com/feed/rss/" rel="nofollow">http://hoopercharles.wordpress.com/feed/rss/</a></p>
<p>My RSS feed only includes a small part of my articles for a variety of reasons.  It seems that various sites strive to be more than blog aggregators, and have a habit of either not identifying the original author of some articles (oraclecommunity.in.ua and <a href="http://www.oracle.cc/the-new-order-oracle-coding-challenge-3-%E2%80%93-mind-boggle.html" rel="nofollow">http://www.oracle.cc/the-new-order-oracle-coding-challenge-3-%E2%80%93-mind-boggle.html</a> seems to come to mind), make it appear that people are writing articles specifically for a site (itnewscast.com/database/new-order-oracle-coding-challenge-2 seems to come to mind), or attempt to charge people to read articles that the author makes freely readable (sswug.org seems to come to mind).  It is not uncommon for me (and I suspect several others who write technical blog articles) to spend several hours developing each article &#8211; limiting the RSS feed simply means that someone must make more of an effort to republish my articles without authorization.<br />
<i>(I have a much longer explanation why my RSS feed includes only partial articles, but this should be a sufficient explanation for now.</i></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3789</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Mon, 15 Aug 2011 10:15:23 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3789</guid>
		<description><![CDATA[I adjusted part 1 per your request.]]></description>
		<content:encoded><![CDATA[<p>I adjusted part 1 per your request.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Stew Ashton</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3788</link>
		<dc:creator><![CDATA[Stew Ashton]]></dc:creator>
		<pubDate>Mon, 15 Aug 2011 09:52:41 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3788</guid>
		<description><![CDATA[Oops, part 1 should have UNION ALL, not UNION. Part 1 shows how I would do things if I did not eliminate duplicates.]]></description>
		<content:encoded><![CDATA[<p>Oops, part 1 should have UNION ALL, not UNION. Part 1 shows how I would do things if I did not eliminate duplicates.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Stew Ashton</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3787</link>
		<dc:creator><![CDATA[Stew Ashton]]></dc:creator>
		<pubDate>Mon, 15 Aug 2011 09:49:18 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3787</guid>
		<description><![CDATA[Just got back from a trip. In case you&#039;re still reading the comments, here is a set of solutions inspired by an asktom thread. Basically, I use aggregation instead of analytics. In parts 2 and 3 I assume that I can throw out duplicate lines in each analyst&#039;s results; this is not necessary, but allows me to add the third table with less change to the code.  Besides, you want us to make dangerous assumptions, right?

By the way, do you have an RSS feed?

&lt;pre&gt;
--PART 1: 
select max(C1) C1, C2, max(C3) C3, max(C4) C4, SUM(T1) T1, SUM(T2) T2 from (
  select C1, C2, C3, C4, 1 T1, 0 T2  from T1
  union all
  select C1, C2, C3, C4, 0 T1, 1 T2 from T2
) group by C2
having SUM(T1) = 0 or SUM(T2) = 0
order by T2;

--part 2:
select C1, C2, C3, C4, sum(t) T from (
  select C1, C2, C3, C4, 1 T from T1
  union
  select C1, C2, C3, C4, 2 T from T2
) group by C1, C2, C3, C4
having SUM(T) in (1, 2)
order by T;

--part 3:
select C1, C2, C3, C4, decode(sum(t),4,3,sum(t)) T from (
  select C1, C2, C3, C4, 1 T from T1
  union
  select C1, C2, C3, C4, 2 T from T2
  union
  select C1, C2, C3, C4, 4 T from T3
) group by C1, C2, C3, C4
having SUM(T) in (1, 2, 4)
order by T;
&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>Just got back from a trip. In case you&#8217;re still reading the comments, here is a set of solutions inspired by an asktom thread. Basically, I use aggregation instead of analytics. In parts 2 and 3 I assume that I can throw out duplicate lines in each analyst&#8217;s results; this is not necessary, but allows me to add the third table with less change to the code.  Besides, you want us to make dangerous assumptions, right?</p>
<p>By the way, do you have an RSS feed?</p>
<pre>
--PART 1: 
select max(C1) C1, C2, max(C3) C3, max(C4) C4, SUM(T1) T1, SUM(T2) T2 from (
  select C1, C2, C3, C4, 1 T1, 0 T2  from T1
  union all
  select C1, C2, C3, C4, 0 T1, 1 T2 from T2
) group by C2
having SUM(T1) = 0 or SUM(T2) = 0
order by T2;

--part 2:
select C1, C2, C3, C4, sum(t) T from (
  select C1, C2, C3, C4, 1 T from T1
  union
  select C1, C2, C3, C4, 2 T from T2
) group by C1, C2, C3, C4
having SUM(T) in (1, 2)
order by T;

--part 3:
select C1, C2, C3, C4, decode(sum(t),4,3,sum(t)) T from (
  select C1, C2, C3, C4, 1 T from T1
  union
  select C1, C2, C3, C4, 2 T from T2
  union
  select C1, C2, C3, C4, 4 T from T3
) group by C1, C2, C3, C4
having SUM(T) in (1, 2, 4)
order by T;
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3715</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Fri, 29 Jul 2011 15:39:42 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3715</guid>
		<description><![CDATA[Part 3
Another solution that builds an exclusion list and joins the exclusion list to all rows from all tables:
&lt;pre&gt;
SELECT
  A.C1,
  A.C2,
  A.C3,
  A.C4,
  A.FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
    &#039;T1&#039; FROM_TABLE
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
    &#039;T2&#039; FROM_TABLE
  FROM
    T2
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
    &#039;T3&#039; FROM_TABLE
  FROM
    T3) A,
  (SELECT
    T1.C1,
    T1.C2,
    T1.C3,
    T1.C4
  FROM
    T1,
    T2
  WHERE
    T1.C1=T2.C1
    AND T1.C2=T2.C2
    AND T1.C3=T2.C3
    AND T1.C4=T2.C4
  UNION ALL
  SELECT
    T1.C1,
    T1.C2,
    T1.C3,
    T1.C4
  FROM
    T1,
    T3
  WHERE
    T1.C1=T3.C1
    AND T1.C2=T3.C2
    AND T1.C3=T3.C3
    AND T1.C4=T3.C4
  UNION ALL
  SELECT
    T2.C1,
    T2.C2,
    T2.C3,
    T2.C4
  FROM
    T2,
    T3
  WHERE
    T3.C1=T2.C1
    AND T3.C2=T2.C2
    AND T3.C3=T2.C3
    AND T3.C4=T2.C4) E
WHERE
  A.C1=E.C1(+)
  AND A.C2=E.C2(+)
  AND A.C3=E.C3(+)
  AND A.C4=E.C4(+)
  AND E.C1 IS NULL;
&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>Part 3<br />
Another solution that builds an exclusion list and joins the exclusion list to all rows from all tables:</p>
<pre>
SELECT
  A.C1,
  A.C2,
  A.C3,
  A.C4,
  A.FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
    'T1' FROM_TABLE
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
    'T2' FROM_TABLE
  FROM
    T2
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
    'T3' FROM_TABLE
  FROM
    T3) A,
  (SELECT
    T1.C1,
    T1.C2,
    T1.C3,
    T1.C4
  FROM
    T1,
    T2
  WHERE
    T1.C1=T2.C1
    AND T1.C2=T2.C2
    AND T1.C3=T2.C3
    AND T1.C4=T2.C4
  UNION ALL
  SELECT
    T1.C1,
    T1.C2,
    T1.C3,
    T1.C4
  FROM
    T1,
    T3
  WHERE
    T1.C1=T3.C1
    AND T1.C2=T3.C2
    AND T1.C3=T3.C3
    AND T1.C4=T3.C4
  UNION ALL
  SELECT
    T2.C1,
    T2.C2,
    T2.C3,
    T2.C4
  FROM
    T2,
    T3
  WHERE
    T3.C1=T2.C1
    AND T3.C2=T2.C2
    AND T3.C3=T2.C3
    AND T3.C4=T2.C4) E
WHERE
  A.C1=E.C1(+)
  AND A.C2=E.C2(+)
  AND A.C3=E.C3(+)
  AND A.C4=E.C4(+)
  AND E.C1 IS NULL;
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3714</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Fri, 29 Jul 2011 14:30:25 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3714</guid>
		<description><![CDATA[Extending the NOT IN approach to the third part of the challenge:
&lt;pre&gt;
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T1&#039; FROM_TABLE
FROM
  T1
WHERE
  (C1,
  C2,
  C3,
  C4)
NOT IN
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T2&#039; FROM_TABLE
FROM
  T2
WHERE
  (C1,
  C2,
  C3,
  C4)
NOT IN
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T3&#039; FROM_TABLE
FROM
  T3
WHERE
  (C1,
  C2,
  C3,
  C4)
NOT IN
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2);
&lt;/pre&gt;

Does another solution EXIST that does not use IN?  :-)]]></description>
		<content:encoded><![CDATA[<p>Extending the NOT IN approach to the third part of the challenge:</p>
<pre>
SELECT
  C1,
  C2,
  C3,
  C4,
  'T1' FROM_TABLE
FROM
  T1
WHERE
  (C1,
  C2,
  C3,
  C4)
NOT IN
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
SELECT
  C1,
  C2,
  C3,
  C4,
  'T2' FROM_TABLE
FROM
  T2
WHERE
  (C1,
  C2,
  C3,
  C4)
NOT IN
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
SELECT
  C1,
  C2,
  C3,
  C4,
  'T3' FROM_TABLE
FROM
  T3
WHERE
  (C1,
  C2,
  C3,
  C4)
NOT IN
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2);
</pre>
<p>Does another solution EXIST that does not use IN?  <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3713</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Fri, 29 Jul 2011 14:23:29 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3713</guid>
		<description><![CDATA[Part 3
A similar idea to the solution provided by Raj:
&lt;pre&gt;
SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
    FROM_TABLE,
    COUNT(*) OVER (PARTITION BY C1, C2, C3, C4) CNT
  FROM
    (SELECT
      C1,
      C2,
      C3,
      C4,
      &#039;T1&#039; FROM_TABLE
    FROM
      T1
    UNION
    SELECT
      C1,
      C2,
      C3,
      C4,
      &#039;T2&#039; FROM_TABLE
    FROM
      T2
    UNION
    SELECT
      C1,
      C2,
      C3,
      C4,
      &#039;T3&#039; FROM_TABLE
    FROM
      T3))
WHERE
  CNT=1;
&lt;/pre&gt;

If using the COUNT analytic function is not an option:
&lt;pre&gt;
SELECT
  C1,
  C2,
  C3,
  C4
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
    FROM_TABLE,
    MAX(RN) OVER (PARTITION BY C1, C2, C3, C4) MRN
  FROM
    (SELECT
      C1,
      C2,
      C3,
      C4,
      FROM_TABLE,
      ROW_NUMBER() OVER (PARTITION BY C1, C2, C3, C4 ORDER BY FROM_TABLE) RN
    FROM
      (SELECT
        C1,
        C2,
        C3,
        C4,
        &#039;T1&#039; FROM_TABLE
      FROM
        T1
      UNION
      SELECT
        C1,
        C2,
        C3,
        C4,
        &#039;T2&#039; FROM_TABLE
      FROM
        T2
      UNION
      SELECT
        C1,
        C2,
        C3,
        C4,
        &#039;T3&#039; FROM_TABLE
      FROM
        T3)))
WHERE
  MRN=1;
&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>Part 3<br />
A similar idea to the solution provided by Raj:</p>
<pre>
SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
    FROM_TABLE,
    COUNT(*) OVER (PARTITION BY C1, C2, C3, C4) CNT
  FROM
    (SELECT
      C1,
      C2,
      C3,
      C4,
      'T1' FROM_TABLE
    FROM
      T1
    UNION
    SELECT
      C1,
      C2,
      C3,
      C4,
      'T2' FROM_TABLE
    FROM
      T2
    UNION
    SELECT
      C1,
      C2,
      C3,
      C4,
      'T3' FROM_TABLE
    FROM
      T3))
WHERE
  CNT=1;
</pre>
<p>If using the COUNT analytic function is not an option:</p>
<pre>
SELECT
  C1,
  C2,
  C3,
  C4
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
    FROM_TABLE,
    MAX(RN) OVER (PARTITION BY C1, C2, C3, C4) MRN
  FROM
    (SELECT
      C1,
      C2,
      C3,
      C4,
      FROM_TABLE,
      ROW_NUMBER() OVER (PARTITION BY C1, C2, C3, C4 ORDER BY FROM_TABLE) RN
    FROM
      (SELECT
        C1,
        C2,
        C3,
        C4,
        'T1' FROM_TABLE
      FROM
        T1
      UNION
      SELECT
        C1,
        C2,
        C3,
        C4,
        'T2' FROM_TABLE
      FROM
        T2
      UNION
      SELECT
        C1,
        C2,
        C3,
        C4,
        'T3' FROM_TABLE
      FROM
        T3)))
WHERE
  MRN=1;
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3712</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Fri, 29 Jul 2011 13:27:30 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3712</guid>
		<description><![CDATA[Part 3 - Determine the list of items that are not wanted, outer join that with the list of items, and make certain that the item is not present in the unwanted list.

Defining the exclusion list:
&lt;pre&gt;
SELECT
  C1,
  C2,
  C3,
  C4
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3);
&lt;/pre&gt;

The finished SQL statement:
&lt;pre&gt;
WITH EXCLUSION AS
(SELECT
  C1,
  C2,
  C3,
  C4
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3))
SELECT
  T1.C1,
  T1.C2,
  T1.C3,
  T1.C4,
 &#039;T1&#039; FROM_TABLE
FROM
  T1,
  EXCLUSION
WHERE
  T1.C1=EXCLUSION.C1(+)
  AND T1.C2=EXCLUSION.C2(+)
  AND T1.C3=EXCLUSION.C3(+)
  AND T1.C4=EXCLUSION.C4(+)
  AND EXCLUSION.C1 IS NULL
UNION ALL
SELECT
  T2.C1,
  T2.C2,
  T2.C3,
  T2.C4,
 &#039;T2&#039; FROM_TABLE
FROM
  T2,
  EXCLUSION
WHERE
  T2.C1=EXCLUSION.C1(+)
  AND T2.C2=EXCLUSION.C2(+)
  AND T2.C3=EXCLUSION.C3(+)
  AND T2.C4=EXCLUSION.C4(+)
  AND EXCLUSION.C1 IS NULL
UNION ALL
SELECT
  T3.C1,
  T3.C2,
  T3.C3,
  T3.C4,
 &#039;T3&#039; FROM_TABLE
FROM
  T3,
  EXCLUSION
WHERE
  T3.C1=EXCLUSION.C1(+)
  AND T3.C2=EXCLUSION.C2(+)
  AND T3.C3=EXCLUSION.C3(+)
  AND T3.C4=EXCLUSION.C4(+)
  AND EXCLUSION.C1 IS NULL;
&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>Part 3 &#8211; Determine the list of items that are not wanted, outer join that with the list of items, and make certain that the item is not present in the unwanted list.</p>
<p>Defining the exclusion list:</p>
<pre>
SELECT
  C1,
  C2,
  C3,
  C4
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3);
</pre>
<p>The finished SQL statement:</p>
<pre>
WITH EXCLUSION AS
(SELECT
  C1,
  C2,
  C3,
  C4
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T1
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3)
UNION ALL
  (SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T2
  INTERSECT
  SELECT
    C1,
    C2,
    C3,
    C4
  FROM
    T3))
SELECT
  T1.C1,
  T1.C2,
  T1.C3,
  T1.C4,
 'T1' FROM_TABLE
FROM
  T1,
  EXCLUSION
WHERE
  T1.C1=EXCLUSION.C1(+)
  AND T1.C2=EXCLUSION.C2(+)
  AND T1.C3=EXCLUSION.C3(+)
  AND T1.C4=EXCLUSION.C4(+)
  AND EXCLUSION.C1 IS NULL
UNION ALL
SELECT
  T2.C1,
  T2.C2,
  T2.C3,
  T2.C4,
 'T2' FROM_TABLE
FROM
  T2,
  EXCLUSION
WHERE
  T2.C1=EXCLUSION.C1(+)
  AND T2.C2=EXCLUSION.C2(+)
  AND T2.C3=EXCLUSION.C3(+)
  AND T2.C4=EXCLUSION.C4(+)
  AND EXCLUSION.C1 IS NULL
UNION ALL
SELECT
  T3.C1,
  T3.C2,
  T3.C3,
  T3.C4,
 'T3' FROM_TABLE
FROM
  T3,
  EXCLUSION
WHERE
  T3.C1=EXCLUSION.C1(+)
  AND T3.C2=EXCLUSION.C2(+)
  AND T3.C3=EXCLUSION.C3(+)
  AND T3.C4=EXCLUSION.C4(+)
  AND EXCLUSION.C1 IS NULL;
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3711</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Fri, 29 Jul 2011 13:13:02 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3711</guid>
		<description><![CDATA[Another solution that becomes messy when introducing the third table:
Part 2:
&lt;pre&gt;
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T1&#039; FROM_TABLE
FROM
  T1
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T1&#039; FROM_TABLE
FROM
  T2
UNION ALL
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T2&#039; FROM_TABLE
FROM
  T2
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T2&#039; FROM_TABLE
FROM
  T1;
&lt;/pre&gt;

Extending the above to Part 3:
&lt;pre&gt;
SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T1&#039; FROM_TABLE
FROM
  T1
MINUS
SELECT
  *
FROM
(SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
   &#039;T1&#039; FROM_TABLE
  FROM
    T2
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
   &#039;T1&#039; FROM_TABLE
  FROM
    T3))
UNION ALL
SELECT
  *
FROM
(SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T2&#039; FROM_TABLE
FROM
  T2
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
   &#039;T2&#039; FROM_TABLE
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
   &#039;T2&#039; FROM_TABLE
  FROM
    T3))
UNION ALL
SELECT
  *
FROM
(SELECT
  C1,
  C2,
  C3,
  C4,
  &#039;T3&#039; FROM_TABLE
FROM
  T3
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
   &#039;T3&#039; FROM_TABLE
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
   &#039;T3&#039; FROM_TABLE
  FROM
    T2));
&lt;/pre&gt;

There are of course still more solutions - probably not as compact as the solutions provided by Raj.]]></description>
		<content:encoded><![CDATA[<p>Another solution that becomes messy when introducing the third table:<br />
Part 2:</p>
<pre>
SELECT
  C1,
  C2,
  C3,
  C4,
  'T1' FROM_TABLE
FROM
  T1
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  'T1' FROM_TABLE
FROM
  T2
UNION ALL
SELECT
  C1,
  C2,
  C3,
  C4,
  'T2' FROM_TABLE
FROM
  T2
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  'T2' FROM_TABLE
FROM
  T1;
</pre>
<p>Extending the above to Part 3:</p>
<pre>
SELECT
  C1,
  C2,
  C3,
  C4,
  'T1' FROM_TABLE
FROM
  T1
MINUS
SELECT
  *
FROM
(SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
   'T1' FROM_TABLE
  FROM
    T2
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
   'T1' FROM_TABLE
  FROM
    T3))
UNION ALL
SELECT
  *
FROM
(SELECT
  C1,
  C2,
  C3,
  C4,
  'T2' FROM_TABLE
FROM
  T2
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
   'T2' FROM_TABLE
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
   'T2' FROM_TABLE
  FROM
    T3))
UNION ALL
SELECT
  *
FROM
(SELECT
  C1,
  C2,
  C3,
  C4,
  'T3' FROM_TABLE
FROM
  T3
MINUS
SELECT
  C1,
  C2,
  C3,
  C4,
  FROM_TABLE
FROM
  (SELECT
    C1,
    C2,
    C3,
    C4,
   'T3' FROM_TABLE
  FROM
    T1
  UNION ALL
  SELECT
    C1,
    C2,
    C3,
    C4,
   'T3' FROM_TABLE
  FROM
    T2));
</pre>
<p>There are of course still more solutions &#8211; probably not as compact as the solutions provided by Raj.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2011/07/28/the-unique-result-oracle-database-coding-challenge/#comment-3710</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Fri, 29 Jul 2011 12:53:58 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=5212#comment-3710</guid>
		<description><![CDATA[Another for the second part of the challenge:
&lt;pre&gt;
SELECT DISTINCT 
  NVL(T1.C1,T2.C1) COL1, 
  NVL(T1.C2,T2.C2) COL2, 
  NVL(T1.C3,T2.C3) COL3, 
  NVL(T1.C4,T2.C4) COL4, 
  NVL2(T1.C1,&#039;T1&#039;,&#039;T2&#039;) FROM_TABLE 
FROM 
  T1 
FULL OUTER JOIN 
  T2 ON T1.C1=T2.C1 AND T1.C2=T2.C2 AND T1.C3=T2.C3 AND T1.C4=T2.C4
WHERE 
  UTL_I18N.RAW_TO_CHAR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C1,&#039;1&#039;),&#039;AL32UTF8&#039;),1)&#124;&#124;
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C2,&#039;1&#039;),&#039;AL32UTF8&#039;),1)&#124;&#124;
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C3,&#039;1&#039;),&#039;AL32UTF8&#039;),1)&#124;&#124;
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C4,&#039;1&#039;),&#039;AL32UTF8&#039;),1),&#039;AL32UTF8&#039;) &lt;&gt;
  UTL_I18N.RAW_TO_CHAR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C1,&#039;1&#039;),&#039;AL32UTF8&#039;),1)&#124;&#124;
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C2,&#039;1&#039;),&#039;AL32UTF8&#039;),1)&#124;&#124;
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C3,&#039;1&#039;),&#039;AL32UTF8&#039;),1)&#124;&#124;
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C4,&#039;1&#039;),&#039;AL32UTF8&#039;),1),&#039;AL32UTF8&#039;);
&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>Another for the second part of the challenge:</p>
<pre>
SELECT DISTINCT 
  NVL(T1.C1,T2.C1) COL1, 
  NVL(T1.C2,T2.C2) COL2, 
  NVL(T1.C3,T2.C3) COL3, 
  NVL(T1.C4,T2.C4) COL4, 
  NVL2(T1.C1,'T1','T2') FROM_TABLE 
FROM 
  T1 
FULL OUTER JOIN 
  T2 ON T1.C1=T2.C1 AND T1.C2=T2.C2 AND T1.C3=T2.C3 AND T1.C4=T2.C4
WHERE 
  UTL_I18N.RAW_TO_CHAR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C1,'1'),'AL32UTF8'),1)||
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C2,'1'),'AL32UTF8'),1)||
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C3,'1'),'AL32UTF8'),1)||
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T1.C4,'1'),'AL32UTF8'),1),'AL32UTF8') &lt;&gt;
  UTL_I18N.RAW_TO_CHAR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C1,'1'),'AL32UTF8'),1)||
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C2,'1'),'AL32UTF8'),1)||
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C3,'1'),'AL32UTF8'),1)||
                       DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(NVL(T2.C4,'1'),'AL32UTF8'),1),'AL32UTF8');
</pre>
]]></content:encoded>
	</item>
</channel>
</rss>
