我確定有人可能會提供一個詳細解釋的特定鏈接,但我會盡力總結它。在編寫查詢時,我嘗試從我要從哪個表獲取數據的位置列出表,並將它作爲「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
您想爲'ddHistorical'中的每個條目選擇一行嗎? –
當你說從ddHistorical的所有值,你需要一個左外連接,ddHistorical在左側 – 2013-06-26 15:47:32