2013-07-28 65 views
0

我想使用表之間的雙連接創建視圖。使用表之間的雙連接的SQL視圖

我正在製作一些旅遊軟件,管理假期預訂。一個人支付的不同物品可以使用不同的貨幣。

我有一張預訂表和一張貨幣表。

一個人可以支付的許多不同物品都儲存在不同的表格中。我創建了一個視圖,顯示每個付款項目類型的欠款總額。

例如欠轉賬:

BookingID CurrencyID TotalTransfersPrice 
1   1   340.00 
2   1   120.00 
2   2   100.00 

例如,欠額外費用:

BookingID CurrencyID TotalExtrasPrice 
1   1   200.00 
1   2   440.00 
2   1   310.00 

到目前爲止都是好的。

我希望做的是創造帶來這一切一起主視圖:

BookingID CurrencyID TotalExtrasPrice TotalTransfersPrice 
1   1   200.00   340.00 
1   2   440.00   NULL 
2   1   310.00   120.00 
2   2   NULL    100.00   

我無法弄清楚如何使上面。我一直在嘗試使用雙連接,因爲我猜我需要爲BookingID和CurrencyID進行連接?

任何想法?

謝謝!

Phil。

+2

您應該始終指定您正在使用的DBMS(Postgres,Oracle,...)。這可能是最佳解決方案取決於您的DBMS。 –

+0

你解決了你的問題嗎?如果有幫助,最好接受下面的答案之一.. – Jivan

+0

我正在使用sql server,對不起,我錯過了。下面路易斯LL的答案工作。非常感謝大家的幫助。 –

回答

1

對於SQL Server

此查詢允許每個{BookingIdCurrencyId}具有在TransferExtras表多於一排。

,因爲你說

我已經創建出每支付項目類型積欠的總視圖。

我被BookinID積累他們CurrencyID

SELECT ISNULL(transfers.BookingId, extras.BookingId) AS BookingId, 
     ISNULL(transfers.CurrencyId, extras.CurrencyId) AS CurrencyId, 
     SUM(TotalExtrasPrice) AS TotalExtrasPrice, 
     SUM(t.TotalTransfersPrice) AS TotalTransfersPrice 
FROM transfers 
FULL OUTER JOIN extras ON transfers.BookingId = extras.BookingId and transfers.CurrencyId = extras.CurrencyId 
GROUP BY ISNULL(transfers.BookingId, extras.BookingId),ISNULL(transfers.CurrencyId, extras.CurrencyId) 
0

使用加入

select t.BookingId,t.CurrencyId,e.TotalExtrasPrice,t.TotalTransfersPrice 
from transfers as t 
join extras as e 
on t.BookingId = e.BookingId and t.CurrencyId = e.CurrencyId 
1

你應該嘗試加入兩個表使用full outer join轉移 & 額外。假設你正在使用MySQL平臺,SQL查詢可以是:

SELECT t.BookingId,t.CurrencyId,e.TotalExtrasPrice,t.TotalTransfersPrice 
FROM transfers as t FULL OUTER JOIN extras as e 
ON t.BookingId = e.BookingId AND t.CurrencyId = e.CurrencyId; 
0

如果你想去的地方BookingID和CurrencyID的組合只有在任一轉讓或附加功能存在,你仍然要包括他們在覆蓋的情況下結果(而不是查找相交)此查詢將執行此操作:

SELECT IDs.BookingId, IDs.CurrencyID, e.TotalExtrasPrice,t.TotalTransfersPrice 
FROM (
    SELECT BookingId,CurrencyId FROM transfers 
    UNION 
    SELECT BookingId,CurrencyId FROM extras 
) IDs 
LEFT JOIN transfers t ON IDs.BookingId=t.BookingId AND IDs.CurrencyID=t.CurrencyID 
LEFT JOIN extras e ON IDs.BookingId=e.BookingId AND IDs.CurrencyID=e.CurrencyID 

此查詢將產生一個與您的示例相同的結果。

0

這工作。所有你需要的是一個簡單的全外連接

SELECT "BookingID", "CurrencyID", 
     ext."TotalExtrasPrice", trans."TotalTransfersPrice" 
FROM Transfers trans FULL OUTER JOIN Extras ext 
USING ("BookingID", "CurrencyID"); 

SQLFiddle演示使用甲骨文