Disclaimer: my SQL skills are basic, to say the least.
Let’s say I have two similar data types in different tables of the same database.
The first table is called hardback and the fields are as follows:
hbID | hbTitle | hbPublisherID | hbPublishDate
The second table is called paperback and its fields hold similar data but the fields are named differently:
pbID | pbTitle | pbPublisherID | pbPublishDate
I need to retrieve the 10 most recent hardback and paperback books, where the publisher ID is 7.
This is what I have so far:
SELECT TOP 10
hbID, hbTitle, hbPublisherID, hbPublishDate AS pDate
bpID, pbTitle, bpPublisherID, pbPublishDate AS pDate
FROM hardback CROSS JOIN paperback
WHERE (hbPublisherID = 7) OR (pbPublisherID = 7)
ORDER BY pDate DESC
This returns seven columns per row, at least three of which may or may not be for the wrong publisher. Possibly four, depending on the contents of pDate, which is almost certainly going to be a problem if the other six columns are for the correct publisher!
In an effort to release an earlier version of this software, I ran two separate queries fetching 10 records each, then sorted them by date and discarded the bottom ten, but I just know there must be a more elegant way to do it!
Any suggestions?
Aside: I was reviewing what I’d written here, when my Mac suddenly experienced a kernel panic. Restarted, reopened my tabs and everything I’d typed was still here! Stack Exchange sites are awesome 🙂
The easiest way is probably a
UNION:If you could have two copies of the same title (1 paperback, 1 hardcover), change the
UNIONto aUNION ALL;UNIONalone discards duplicates. You could also add a column that indicates what book type it is by adding a pseudo-column to each select (after the publish date, for instance):You’ll have to add the same new column to the paperback half of the query, using ‘P’ instead. Note that on the second query you don’t have to specify column names; the resultset takes the names from the first one. All column data types in the two queries have match, also – you can’t
UNIONa date column in the first with a numeric column in the second without converting the two columns to the same datatype in the query.Here’s a sample script for creating two tables and doing the select above. It works just fine in SQL Server Management Studio.Just remember to drop the two tables (using
DROP Table tablename) when you’re done.