2013-06-26 33 views
0

所以,好吧,我有幾張桌子。我當前的查詢是針對「歷史」表運行的。我想要做某種連接從我的當前表中獲取最新狀態。這些表共享柱樣,所謂的「ID」我無法纏住我的頭附近

這裏的結構現在

ddCurrent 
    -ID 
    -Location 
    -Status 
    -Time 

ddHistorical 
    -CID (AI field to keep multiple records per site) 
    -ID 
    -Location 
    -Status 
    -Time 

我的目標是做一個簡單的加入擺脫ddHistorical所有的變量和ddCurrent當前狀態。

我知道他們可以加入ID,因爲他們兩個在他們的ID表中有相同的項目,我只是不知道哪種加入是合適的,或者爲什麼?

+0

您想爲'ddHistorical'中的每個條目選擇一行嗎? –

+0

當你說從ddHistorical的所有值,你需要一個左外連接,ddHistorical在左側 – 2013-06-26 15:47:32

回答

0

我確定有人可能會提供一個詳細解釋的特定鏈接,但我會盡力總結它。在編寫查詢時,我嘗試從我要從哪個表獲取數據的位置列出表,並將它作爲「FROM」子句中的第一個表。然後,根據關係(如ID)對其他表執行「JOIN」標準。在您的例子

FROM 
    ddHistorical ddH 
     INNER JOIN ddCurrent ddC 
     on ddH.ID = ddC.ID 

在這種情況下,INNER JOIN(同JOIN)的ddHistorical表是左表(先爲我的風格的一致性和壓痕上市)和ddCurrent是右表。注意我的ON標準,將它們連接在一起也留下了別名.column = right別名table.column - 同樣,這僅僅是爲了心理關聯的目的。內部連接(或JOIN)表示記錄必須在每一側都有匹配,否則將被丟棄。

LEFT JOIN表示給我所有記錄在左表(在這種情況下爲ddHistorical),無論右表中的匹配是什麼(ddCurrent)。在這個例子中不實用。

右連接是相反的,給我從右側表中的所有記錄,而不管匹配的記錄在左側表。大多數情況下,您會看到「左連接」比「右連接」更頻繁。現在

,樣品在精神上得到左加入。你在一家汽車經銷店工作,並擁有一輛售出10輛汽車的主表。對於給定的月份,你想知道什麼不是銷售。因此,從所有汽車的主表開始,查看DID出售的銷售表。如果沒有這樣的銷售活動右側表將有NULL值

select 
     M.CarID, 
     M.CarModel 
    from 
     MasterCarsList M 
     LEFT JOIN CarSales CS 
      on M.CarID = CS.CarID 
      AND month(CS.DateSold) = 4 
    where 
     CS.CarID IS NULL 

所以,我LEFT JOIN是基於一個匹配的車ID - 和 - 銷售活動的月份是4(4月)因爲我可能不關心1月至3月的銷售情況 - 但也可以符合一年的條件,但這是一個簡單的例子。

如果在汽車銷售表中沒有記錄它會在所有列NULL值。我只是關心汽車ID列,因爲那是加入的基礎。這就是爲什麼我將它包含在WHERE子句中的原因。對於所有其他類型的汽車,有銷售它將有一個價值。

這是一種常見的方法,你會在查詢看到有人找所有不管其他...一些使用哪裏都不存在(子查詢),但是那些因爲他們測試的每個記錄執行慢。加入速度要快得多。

其他例子可能是你想要一個公司所有員工的清單,如果他們有一些認證/培訓來顯示它......你仍然希望所有員工,但是左加入一些認證/培訓表會根據需要公開這些額外的字段。

select 
     Emp.FullName, 
     Cert.DateCertified 
    FROM 
     Employees Emp 
     Left Join Certifications Cert 
      on Emp.EmpID = Cert.EmpID 

希望這些樣本可以幫助您更好地瞭解查詢的關係,現在可以真正爲您的需求提供答案。

如果你想要的是所有的「當前」的項目清單,並想看看他們過去的歷史,我會用當前的第一。這可能是,如果你當前的事物表是50,但是歷史上你的表有420個項目。你不關心其他360項目,只是那些當前和那些歷史。

select 
     ddC.WhateverColumns, 
     ddH.WhateverHistoricalColumns 
    from 
     ddCurrent ddC 
     JOIN ddHistorical ddH 
      on ddC.ID = ddH.ID 
0

如果總是有電流場那麼簡單的INNER JOIN會做

SELECT a.CID, a.ID, a.Location, a.Status, a.Time, b.Status 
FROM ddHistorical a 
INNER JOIN ddCurrent b 
ON a.ID = b.ID 
0

INNER JOIN會忽略那些沒有在ddCurrent相應ID任何ddHistorical行。

一個LEFT JOIN將包括所有ddHistorical行,即使他們沒有在ddCurrent相應ID,但ddCurrent值將是空的(因爲它們是未知)。

另請注意,LEFT JOIN只是特定類型的外連接。不要打擾其他人 - 90%或更多你會做的將是INNERLEFT

要只包括那些ddHistorical行,其中的ID ddCurrent

SELECT h.CID, h.ID, h.Location, h.Status, c.Status, h.Time 
FROM ddHistorical h 
INNER JOIN ddCurrent c ON h.ID = c.ID 

如果你想包括ddHistorical行即使ID ddCurrent

SELECT h.CID, h.ID, h.Location, h.Status, c.Status, h.Time 
FROM ddHistorical h 
LEFT JOIN ddCurrent c ON h.ID = c.ID 

如果所有ddHistorical行碰巧與ddCurrent中的ID匹配,請注意這兩個查詢將返回相同的結果。

+0

這是一個很棒的答案:)現在...外連接做什麼? – user2249610

+0

有一個偉大的視覺表示形式的連接[here](http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins)。看看前四項,但請注意,他們稱之爲「OUTER」的也稱爲「FULL OUTER」,而「LEFT」或「RIGHT」也是「OUTER」的類型。在我上面的例子中,你可以使用'LEFT OUTER JOIN ddCurrent',它和'LEFT JOIN ddCurrent'(沒有'OUTER')是一樣的 - 'OUTER'是可選的,因爲'LEFT'根據定義是'OUTER '。這可能會令人困惑,用文字解釋,所以一定要看看鏈接中的圖片。 –

相關問題