2014-10-04 40 views
1

我正在更新一個網站,可能會運行一個荒謬的數量的查詢!根據第一個表中的數據運行查詢從一個表中選擇數據和兩個可能的其他表中的一個表

簡單的形式有3個表格;

更新 UpdateID Files_FileID Pages_PageID UpdateDate

頁面 PAGEID 的PageTitle

文件 寫到FileID FileTitle

Files_FileID在在頁面表更新錶鏈接到PAGEID文件表 Pages_PageID的更新錶鏈接寫到FileID

目前的代碼不會在更新表選擇查詢,然後通過運行的另一個這些結果循環如果Pages_PageID有值,則查詢Pages表上的每個結果;如果Files_FileID具有值,則查詢Files表上的每個結果。如果這個網站最初是在大約15年前完成的,現在這可能是沒問題的(如果不好的做法),但是我正要添加近2000個新文件,這些文件將會在更新表中列出!

我想改變它(如果可能)運行一個查詢。這可以做到嗎?

我可以看到我可以將它分成兩個查詢,一個用於頁面,另一個用於文件,但然後我有兩個基於UpdateDate的結果,我無法以正確的順序顯示它們。

+0

可能會看看CASE語句...您可以使用case語句來有條件地選擇數據 – Drew 2014-10-04 17:22:02

+0

使用左連接進行研究。你可以通過在你的兩個表上使用兩個左連接來完成這個工作 – 2014-10-04 17:22:08

回答

6

大概,你想得到正在更新的東西的類型和標題。

您的問題的答案是,正確的加入應該是一個很大的好處。在這種情況下,下面可以做你想做的:

select u.updateid, updatedate, 
     (case when f.fileid is not null then 'File' else 'Page' end) as which, 
     coalesce(FileTitle, PageTitle) as title 
from updates u left join 
    files f 
    on u.files_fileid = f.fileid left join 
    pages p 
    on u.pages_pageid = p.pageid; 

這假定每個記錄僅是指一個頁面或一個文件,但不能同時使用。此外,爲了提高性能,您需要在每個表中的主鍵上使用索引(如果它們被定義爲主鍵,則有索引)。

+0

感謝Gordon,不錯的一個:)我試過了,儘管它目前沒有工作,可能是因爲當前的數據庫是舊的MS Access數據庫, m將其更改爲MySQL數據庫。但是,在查詢之後,我可以看到它應該做什麼,以便更多地查看SQL案例和左連接。再次感謝。 – luke 2014-10-05 11:41:56

+1

@ user3684025。 。 。 MS Access版本看起來有些不同:例如,表格別名爲'as',連接爲圓括號,'iff()'代替'case'和'coalesce'等。 – 2014-10-05 13:43:45

相關問題