简体   繁体   中英

Minus and order by in Oracle db

I want to do a minus operation on two tables in an Oracle DB. The first table is Chart_Year that has trackPosition, trackArtist, trackName, previewLink in it. The other table is Recommendation that has just trackArtist, trackName, previewLink in it. I want the final table to be ordered by trackPosition. The way I do it is order by trackArtist:

SELECT trackartist, trackname, previewlink 
FROM 
    (
        SELECT 
            trackposition, trackartist, trackname, previewlink 
        FROM 
            chart_year 
        WHERE 
            chartsYear between 2004 and 2008 
        ORDER BY trackposition ASC
    )

MINUS 

SELECT 
    trackartist, trackname, previewlink 
FROM 
    recommendation 
WHERE 
    user = 'bla'

Maybe I can do something like

SELECT 
    1 as trackPosition, trackartist, trackname, previewlink 
FROM 
    recommendation...

?

Instead of MINUS , you can use EXISTS :

SELECT trackartist, trackname, previewlink
  FROM chart_year cy
 WHERE chartsYear BETWEEN 2004 AND 2008
   AND NOT EXISTS
        ( SELECT 1
            FROM recommendation r
           WHERE r.user = 'bla'
             AND r.trackartist = cy.trackartist
             AND r.trackname = cy.trackname
             AND r.previewlink = cy.previewlink
        )
 ORDER
    BY trackposition ASC
;

Or a LEFT OUTER JOIN :

SELECT cy.trackartist, cy.trackname, cy.previewlink
  FROM chart_year cy
  LEFT
 OUTER
  JOIN recommendation r
    ON r.user = 'bla'
   AND r.trackartist = cy.trackartist
   AND r.trackname = cy.trackname
   AND r.previewlink = cy.previewlink
 WHERE cy.chartsYear BETWEEN 2004 AND 2008
   AND r.user IS NULL -- i.e., where the join failed
 ORDER
    BY cy.trackposition ASC
;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM