我尝试使用表之间的双连接创建视图。
我正在制作一些旅行软件,管理假日预订。一个人支付的不同物品可以是不同的货币。
我有一张预订表和一张货币表。
一个人可以支付许多不同的项目,所有项目都存储在不同的表格中。我创建了一个视图,显示每笔付款项目类型的总欠款。
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进行连接吗?
有什么想法吗?
谢谢!
菲尔。
答案 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
此查询允许每个{BookingId
,CurrencyId
}在Transfer
和Extras
表中包含多行。
因为你说过
我创建了一个视图,显示每个付款项目类型的总欠款。
我正在通过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 演示。