SQL Union Query simple question

Hello all,

I have the following Union query:

SELECT DS.SOURCE_ID, DSD.COLUMN_NAME, 'N' AS MAP_FLAG
     FROM CDIP.SV_DATA_SOURCE DS INNER JOIN CDIP.SV_DATA_SOURCE_DETAIL DSD ON DS.ID = DSD.DATA_SOURCE_ID WHERE DSD.VC_FLAG = 0  
          UNION SELECT SOURCE_ID, COLUMN_NAME, 'Y' AS MAP_FLAG FROM CDIP.SV_DEFAULT_SOURCE_MAPPING

What I am wanting to do is this:
There will be column names in the top part of the UNION that will exist also in the bottom CDIP.SV_DEFAULT_SOURCE_MAPPING table.  If there is a record in the CDIP.SV_DEFAULT_SOURCE_MAPPING table then I want to have a flag that says MAP_FLAG = 'Y" to signify I have a mapped record otherwise if it only exists in the top part have it be 'N' but right now of course based on if it exists in both the UNION will create 2 records for each.   There will be other records with different column names in the bottom part so those I want again flagged as 'Y' for the MAP_FLAG.

Hope this makes sense.
sbornstein2Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

dougaugCommented:
See if this works:

SELECT DS.SOURCE_ID, DSD.COLUMN_NAME, 'N' AS MAP_FLAG
     FROM CDIP.SV_DATA_SOURCE DS INNER JOIN CDIP.SV_DATA_SOURCE_DETAIL DSD ON DS.ID = DSD.DATA_SOURCE_ID WHERE DSD.VC_FLAG = 0  
UNION
SELECT DSM.SOURCE_ID, DSM.COLUMN_NAME, 'Y' AS MAP_FLAG FROM CDIP.SV_DEFAULT_SOURCE_MAPPING DSM
 WHERE NOT EXISTS (SELECT *
                     FROM CDIP.SV_DATA_SOURCE DS INNER JOIN CDIP.SV_DATA_SOURCE_DETAIL DSD ON DS.ID = DSD.DATA_SOURCE_ID WHERE DSD.VC_FLAG = 0
                    WHERE DSM.SOURCE_ID = DS.SOURCE_ID
                      AND DSM.COLUMN_NAME = DSD.COLUMN_NAME)
0
Scott PletcherSenior DBACommented:
SELECT
    COALESCE(t1.source_id, t2.source_id) AS Source_Id,
    COALESCE(t1.column_name, t2.column_name) AS Column_Name,
    CASE WHEN t2.column_name IS NULL THEN 'N' ELSE 'Y' END AS Map_Flag
FROM (
    SELECT DS.SOURCE_ID, DSD.COLUMN_NAME, 'N' AS MAP_FLAG
    FROM CDIP.SV_DATA_SOURCE DS
    INNER JOIN CDIP.SV_DATA_SOURCE_DETAIL DSD ON
        DS.ID = DSD.DATA_SOURCE_ID
    WHERE
        DSD.VC_FLAG = 0
) AS t1
FULL OUTER JOIN (
    SELECT SOURCE_ID, COLUMN_NAME, 'Y' AS MAP_FLAG
    FROM CDIP.SV_DEFAULT_SOURCE_MAPPING
) AS t2 ON
    t1.source_id = t2.source_id AND
    t1.column_name = t2.column_name
0
sbornstein2Author Commented:
this was perfect thanks
0
Cloud Class® Course: Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

sbornstein2Author Commented:
I screwed up this actually did not work, it only returned a 'Y' flag for the record that existed in the DEFAULT MAPPING table that was not in the DETAIL table.
0
sbornstein2Author Commented:
Scott I may owe you some points :).   Your solution is not working though its actually PL/SQL but is throwing the error;

SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:
Error at Line: 50 Column: 2
0
Scott PletcherSenior DBACommented:
Hmm, PL/SQL, been years since I did Oracle full time (Oracle 8 to be precise :-) ).

I think everything in that statement is OK for Oracle too, including CASE, which is now an ANSI standard.

I'm assuming you added the ";" at the end, always required for Ora.
0
Scott PletcherSenior DBACommented:
[I have to admit, I kinda wondered how the statement you selected would actually do what you stated you wanted ... :-). ]
0
sbornstein2Author Commented:
Ya I will figure it out maybe I will request attention for the question, my bad sorry I should have better checked before awarding.
0
Scott PletcherSenior DBACommented:
Sorry, I don't even have any version of Ora to check it on.

Which version of Ora?  I can check the syntax online.
0
sbornstein2Author Commented:
Looks like its throwing that error on this line:

) AS t1

like it's looking for another paren close or something ya the semi-colon is not the issue
0
Scott PletcherSenior DBACommented:
OK, web search tells me that Ora does not the like "AS" in a derived table alias.  
Well isn't that less clear :-) .

From what I can tell, everything else should be OK in Ora ( since I used the ANSI-compliant COALESCE() and not ISNULL() ):

So:

SELECT
    COALESCE(t1.source_id, t2.source_id) AS Source_Id,
    COALESCE(t1.column_name, t2.column_name) AS Column_Name,
    CASE WHEN t2.column_name IS NULL THEN 'N' ELSE 'Y' END AS Map_Flag
FROM (
    SELECT DS.SOURCE_ID, DSD.COLUMN_NAME, 'N' AS MAP_FLAG
    FROM CDIP.SV_DATA_SOURCE DS
    INNER JOIN CDIP.SV_DATA_SOURCE_DETAIL DSD ON
        DS.ID = DSD.DATA_SOURCE_ID
    WHERE
        DSD.VC_FLAG = 0
) t1
FULL OUTER JOIN (
    SELECT SOURCE_ID, COLUMN_NAME, 'Y' AS MAP_FLAG
    FROM CDIP.SV_DEFAULT_SOURCE_MAPPING
) t2 ON
    t1.source_id = t2.source_id AND
    t1.column_name = t2.column_name;
0
sbornstein2Author Commented:
That worked I just had to add a GROUP BY in the first part as there could be the same source and column name repeated actually.  I am going to request attention for this question.
0
Scott PletcherSenior DBACommented:
>> That worked I just had to add a GROUP BY in the first part as there could be the same source and column name repeated actually.  <<

That will work.  Technically DISTINCT will usu perform better just to remove dups:

FROM (
    SELECT DISTINCT DS.SOURCE_ID, DSD.COLUMN_NAME, 'N' AS MAP_FLAG
    FROM CDIP.SV_DATA_SOURCE DS
    INNER JOIN CDIP.SV_DATA_SOURCE_DETAIL DSD ON
        DS.ID = DSD.DATA_SOURCE_ID
    WHERE
        DSD.VC_FLAG = 0
) t1


Yeah, I really had forgotten that Ora didn't allow the "AS" before a derived table alias.  Kinda quirky, because it does allow the AS after a non-derived table:

FROM CDIP.SV_DATA_SOURCE AS DS
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
sbornstein2Author Commented:
Thanks Scott looks like they reopened this for me.  Sorry it took so long for me to reward it right.  All set
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft SQL Server 2008

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.