2009-12-01 33 views
1

我有一個SQL數據庫SQL加入無需多次LEFT

車輛, RepairCharges, TowCharges在下表中,

總會有隻有1用於車用其它表的記錄,但多條記錄。但是,如果在連接的表中有多個條目,那麼我的當前LEFT OUTER Join正常工作,那麼它返回的行數很多。

我的問題是,我需要創建一個SQL視圖,將JOIN這些表,但是隻返回車輛表的單個記錄,即使連接表中有多個記錄。這是可能的一個視圖,還是我必須使用不同的方法?

編輯:從答案中,我意識到,因爲我原本以爲,這是不可能的設計。鑑於同樣的情況,你會如何處理這個問題?

最終結果是每張車輛都有一張表,顯示1行,並在同一行顯示第一次拖曳和維修費用,如果有更多的拖曳或維修費用,則爲每個車輛顯示一條新行,而不會複製車輛信息。

+3

您需要定義你還想要什麼。例如,如果有多個牽引費用,你想要返回什麼?你想要最新的嗎? – 2009-12-01 20:05:20

+0

在這種情況下,您希望返回Repair或Tow中的多個記錄中的哪一個? – SqlRyan 2009-12-01 20:05:34

+0

需要樣品數據+樣品輸出。我不明白這個問題。 – Jrud 2009-12-01 20:08:50

回答

6

,除非您使用AGGREGATE函數,否則從1到MANY的連接將按設計返回1返回MANY。

你有具體的,如只返回滯後,或最昂貴的。

顯示您的查詢,並指定您需要的許多。

2

除了彙總之外,您可以嘗試在查詢中添加DISTINCT子句。

4

JOIN的結果將始終包含左邊的記錄數乘以右邊的記錄數。這是JOIN定義的一部分,如果將​​其設置爲視圖或保留臨時SQL,則不會更改任何內容。

你需要做的是改變什麼加入,所以它只有一行。您需要表示一個條件,從許多可能的候選人中選擇哪些的RepairCharges和TowCharges中的可能行感興趣。上次約會?最高收費?最接近滿月階段?那麼你加入的只有一排。

例子:

SELECT * FROM Vechicles 
CROSS APPLY (
SELECT TOP (1) * 
FROM RepairCharges 
WHERE VechicleID = Vechicles.VechicleID 
ORDER BY RepairDate DESC) AS LastRepair;