gausss
gausss

Reputation: 353

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...

?

Upvotes: 2

Views: 755

Answers (1)

ruakh
ruakh

Reputation: 183484

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
;

Upvotes: 1

Related Questions