在表之间使用双连接的SQL视图

时间:2013-07-28 08:19:08

标签: sql

我尝试使用表之间的双连接创建视图。

我正在制作一些旅行软件,管理假日预订。一个人支付的不同物品可以是不同的货币。

我有一张预订表和一张货币表。

一个人可以支付许多不同的项目,所有项目都存储在不同的表格中。我创建了一个视图,显示每笔付款项目类型的总欠款。

e.g。欠转账:

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

e.g。欠额外费用:

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进行连接吗?

有什么想法吗?

谢谢!

菲尔。

5 个答案:

答案 0 :(得分:1)

您应该尝试使用full outer join加入两个表:转移&amp; <强>附加功能即可。假设您使用的是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;

答案 1 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分: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

此查询将生成与您的示例相同的结果。

答案 4 :(得分:0)

这很有效。您只需要一个简单的全外连接

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

SQLFiddle 演示。