Reputation: 353
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
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