2012-04-13 39 views
0

聲明:我的SQL技能是基本的,至少可以說。如何從兩張獨立的表中同時檢索類似的數據?

假設我在同一個數據庫的不同表中有兩個類似的數據類型。

第一個表被稱爲精裝和字段說明如下:

hbID | hbTitle | hbPublisherID | hbPublishDate

第二個表被稱爲平裝及其字段舉行類似的數據,但字段命名不同:

pbID | pbTitle | pbPublisherID | pbPublishDate

我需要檢索10個最近的h ardback和平裝書,其中發佈者ID爲7

這是我到目前爲止有:

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 

這將返回,每行7列,其中至少有三個可能會或可能不會對錯誤的出版商可能有四種,這取決於pDate的內容,如果其他六列適合正確的出版商,這幾乎肯定會成爲問題!

在努力推出這個軟件的早期版本,我跑了兩個單獨的查詢獲取各10條記錄,然後按日期排序他們丟棄的倒數十名,但我只是知道必須有一個更優雅的方式去做吧!

有什麼建議嗎?

另外:我正在評論我在這裏寫的內容,當時我的Mac突然遇到內核恐慌。重新啓動,重新打開我的標籤,我輸入的所有內容仍然在這裏!堆棧交易所網站是真棒:)

回答

2

最簡單的方法可能是一個UNION

SELECT TOP 10 * FROM 
(SELECT hbID, hbTitle, hbPublisherID as PublisherID, hbPublishDate as pDate 
FROM hardback 
UNION 
SELECT hpID, hpTitle, hpPublisher, hpPublishDate 
FROM paperback 
) books 
WHERE PublisherID = 7 

如果你可以有相同的標題(1個平裝,精裝1)一式兩份,改變UNIONUNION ALL; UNION單獨丟棄重複。你也可以添加一列表示什麼書鍵入它是通過增加一個僞列,以每一個選擇(在發佈日期之後,例如):

hbPublishDate as pDate, 'H' as Covertype 

你必須同新列添加到平裝的一半查詢,用'P'代替。請注意,在第二個查詢中,您不必指定列名稱;結果集採用第一個名稱。兩個查詢中的所有列數據類型都是匹配的,而且 - 不能在第一個日期列中使用第二個日期列,而在第二個日期列中不能將兩列轉換爲查詢中的同一數據類型。

以下是創建兩個表格並執行上述選擇的示例腳本。它在SQL Server Management Studio中運行良好。請記住在完成後刪除兩個表(使用DROP Table tablename)。

use tempdb; 
create table Paperback (pbID Integer Identity, 
    pbTitle nvarchar(30), pbPublisherID Integer, pbPubDate Date); 
create table Hardback (hbID Integer Identity, 
    hbTitle nvarchar(30), hbPublisherID Integer, hbPubDate Date); 

insert into Paperback (pbTitle, pbPublisherID, pbPubDate) 
    values ('Test title 1', 1, GETDATE()); 
insert into Hardback (hbTitle, hbPublisherID, hbPubDate) 
    values ('Test title 1', 1, GETDATE()); 

select * from (
    select pbID, pbTitle, pbPublisherID, pbPubDate, 'P' as Covertype 
    from Paperback 
    union all 
    select hbID, hbTitle, hbPublisherID, hbPubDate,'H' 
    from Hardback) books 
order by CoverType; 

/* You'd drop the two tables here with 
DROP table Paperback; 
DROP table HardBack; 
*/ 
+0

感謝您的回答;我試圖讓它工作,但得到語法錯誤。我確定這是我的錯,只是不想讓你以爲我忽略了你的答案,而我試圖修復它... – Kalessin 2012-04-13 18:56:25

+0

你得到了什麼語法錯誤?我沒有看到任何對SQL Server 2000有疑問的東西。 – 2012-04-13 19:19:22

+0

我在關鍵字'WERE''附近得到錯誤語法。我現在要回家過週末了,我會盡力在週一早上不去想它:) – Kalessin 2012-04-13 19:24:42

0

我認爲這顯然是更好的,如果您只有一個表到另一個持有約像hardbackpaperback的條目的類別信息的參考。這是我的第一個建議。順便說一下,你的編程語言是什麼?

+0

是的,這也是我的第一個建議。不幸的是,第二張桌子是在第一張桌子後面添加的,因爲特定於商業的原因(顯然這不是我們正在處理的兩張桌子)。我正在用PHP進行編程。 – Kalessin 2012-04-13 18:55:20

+0

這應該是對原始問題的評論,因爲它沒有回答問題。如果你真的回答首先問的問題,建議更改數據庫模式將會很好。不過,你忘了這麼做。 [FAQ](http://stackoverflow.com/faq)可能是很好的回顧,因爲它解釋了答案和評論之間的區別;基本上是一個答案*答案*提出的問題(然後可以包含其他建議或信息),而評論只是提出一個建議,就像你在這裏所做的那樣。 :) – 2012-04-13 19:39:24

+0

jup。後來我意識到最好是對這個問題發表評論,而不是把它寫成答案。 :) – varg 2012-04-13 19:47:32

相關問題