Link to home
Start Free TrialLog in
Avatar of sbornstein2
sbornstein2

asked on

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.
Avatar of dougaug
dougaug
Flag of Brazil image

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)
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
Avatar of sbornstein2
sbornstein2

ASKER

this was perfect thanks
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.
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
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.
[I have to admit, I kinda wondered how the statement you selected would actually do what you stated you wanted ... :-). ]
Ya I will figure it out maybe I will request attention for the question, my bad sorry I should have better checked before awarding.
Sorry, I don't even have any version of Ora to check it on.

Which version of Ora?  I can check the syntax online.
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
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;
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.
ASKER CERTIFIED SOLUTION
Avatar of Scott Pletcher
Scott Pletcher
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks Scott looks like they reopened this for me.  Sorry it took so long for me to reward it right.  All set