2011-03-03 92 views
8

我有一個核心表和3個以不同方式擴展'核心'表的表。要使用哪種加入類型?

我正在使用MLS數據,我有一個'common'表,其中包含所有mls列表共有的信息,然後是具有「住宅」信息,「商業」等的表格。當我知道屬性類型已知時的列表時,我一直在使用mls數字來加入單個表格,但是爲了搜索,我想加入所有這些列表,併爲搜索條件提供特殊字段(而不是簡單地搜索公共表格)。

什麼類型的連接會給我一個包含所有列表的數據集(包括idx表中的擴展字段)?

對於每個公用表記錄,中只有一個對應的記錄,其中只有一個的idx表。

     ___________ 
        |   | 
        | COMMON | 
        |   | 
        |___________| 
         _|_ 
          | 
     ___________________|_____________________ 
    _|_     _|_     _|_ 
_____|_____   _____|______   ____|______ 
|   |  |   |   |   | 
| IDX1 |  | IDX2  |   | IDX3 | 
|   |  |   |   |   | 
|___________|  |____________|   |___________| 
+1

對於漂亮的圖表+1! – Orbit 2011-03-03 21:02:14

+1

一般而言,搜索是針對*模型寫入的,但視圖可能用於扁平化模型...無論如何,取決於數據,可能是INNER(「正常」),但可能是LEFT連接。這個問題對我來說沒有多大意義 - 它太模糊了。 – 2011-03-03 21:04:43

+0

你可以發佈表結構和所需輸出的結構嗎?而且,這些都是一對一的關係嗎? – Oded 2011-03-03 21:04:45

回答

6

如果你想在一排的一切,你可以使用這樣的格式。基本上,它可以讓你所有的「通用」字段,然後其他的領域,如果有匹配,否則NULL

SELECT Common.*, 
     Idx1.*, 
     Idx2.*, 
     Idx3.* 
FROM Common 
LEFT JOIN Idx1 
    ON Idx1.MLSKey = Common.MLSKey 
LEFT JOIN Idx2 
    ON Idx2.MLSKey = Common.MLSKey 
LEFT JOIN Idx3 
    ON Idx3.MLSKey = Common.MLSKey 

請記住這是更好地列出領域比使用SELECT *儘可能...

此外,我假設MySQL語法與SQL Server相同,這是我使用的。

+1

由於原始問題中的數據描述,**(內部)連接**將不返回任何行,所以使用** left(outer)join **是關鍵。 – 2011-03-04 03:24:12

0

我有一個類似的表設置表'工作'是核心表的表。

我有這樣的查詢選擇從其他各2個表中的某些元素:

SELECT jobs.frequency, twitterdetails.accountname, feeds.feed 
FROM jobs 
JOIN twitterdetails ON twitterdetails.ID = jobs.accountID 
JOIN feeds ON jobs.FeedID = feeds.FeedID 
WHERE jobs.username ='".$currentuser."';"); 

所以,你可以看到,沒有具體的JOIN,但連接字段定義。你可能只需要一個額外的JOIN線爲你的設置。

0

醜陋的解決方案/企圖差/可能有誤解的問題:

SELECT common.*,IDX1.field,NULL,NULL FROM COMMON 
LEFT JOIN IDX1 ON COMMON.ID = IDX1.ID 
WHERE TYPE="RESIDENTIAL" 
UNION ALL 
SELECT common.*,NULL,IDX2.field,NULL FROM COMMON 
LEFT JOIN IDX2 ON COMMON.ID = IDX2.ID 
WHERE TYPE="RESIDENTIAL" 
UNION ALL 
SELECT common.*,NULL,NULL,IDX3.field FROM COMMON 
LEFT JOIN IDX3 ON COMMON.ID = IDX3.ID 
WHERE TYPE="INDUSTRIAL" 
0

軌道靠近。使用內部連接,而不是連接。如果它沒有idx中的行,則不希望共同出現在聯接中。

假設每個共同記錄只能有1個idx表,你必須聯合3個查詢來獲得正確的結果。插入「NULL」以填寫每個idx表丟失的列,以便它們可以聯合。

順便說一句,你的餐桌設計很好。