0

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

我正在开发一些旅行软件,管理假期预订。一个人支付的不同项目可以使用不同的货币。

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

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

例如欠转账:

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

有任何想法吗?

谢谢!

菲尔。

4

5 回答 5

1

您应该尝试full outer join在加入两个表时使用:Transfers & Extras。假设您使用的是 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;
于 2013-07-28T08:41:52.527 回答
1

为了SQL Server

此查询允许每个 { BookingId, } 在and表 CurrencyId中具有多于一行。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)
于 2013-07-28T08:45:54.653 回答
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
于 2013-07-28T08:24:40.610 回答
0

这行得通。您所需要的只是一个简单的完全外连接

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

使用Oracle的SQLFiddle演示。

于 2013-07-28T09:01:40.573 回答
0

如果您想涵盖 BookingID 和 CurrencyID 的组合仅存在于 Transfers 或 Extras 中的情况,并且您仍希望将它们包含在结果中(而不是查找相交),则此查询将执行此操作:

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

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

于 2013-07-28T08:42:01.197 回答