添加联接条件时,SQLite总查询数增加
我正在尝试使用这个简化的模式从SQLite数据库获取付款总额添加联接条件时,SQLite总查询数增加,sqlite,Sqlite,我正在尝试使用这个简化的模式从SQLite数据库获取付款总额 CREATE TABLE [Orders] ( [OrderId] text NOT NULL COLLATE NOCASE ,PRIMARY KEY ([OrderId]) ); CREATE TABLE [OrderDetails] ( [OrderDetailId] text NOT NULL COLLATE NOCASE ,[OrderId] text NOT NULL COLLAT
CREATE TABLE [Orders] (
[OrderId] text NOT NULL COLLATE NOCASE
,PRIMARY KEY ([OrderId])
);
CREATE TABLE [OrderDetails] (
[OrderDetailId] text NOT NULL COLLATE NOCASE
,[OrderId] text NOT NULL COLLATE NOCASE
,PRIMARY KEY ([OrderDetailId])
FOREIGN KEY ( [OrderId]) REFERENCES [Orders]( [OrderId] )
);
CREATE TABLE [Payments] (
[OrderId] text NOT NULL COLLATE NOCASE
,[PaymentAmount] numeric NOT NULL
,[PaymentDate] datetime NOT NULL
,[PaymentId] text NOT NULL COLLATE NOCASE
,PRIMARY KEY ([PaymentId])
FOREIGN KEY ( [OrderId]) REFERENCES [Orders]( [OrderId] )
此查询返回正确的结果
SELECT
TOTAL(PaymentAmount) AS Paid
FROM Orders LEFT JOIN Payments ON Orders.OrderId=Payments.OrderId
但是如果我也加入了类似这样的OrderDetails
SELECT
TOTAL(PaymentAmount) AS Paid
FROM Orders LEFT JOIN Payments ON Orders.OrderId=Payments.OrderId
INNER JOIN OrderDetails ON Orders.OrderId=OrderDetails.OrderId
支付的金额增加了。为什么结果不同
如果单个PaymentAmount为$50,则编辑不带联接的查询返回PaymentAmount=50。带有联接的查询返回Paid=100
支付的金额增加了。为什么结果不同
因为您要为订单付款和订单详细信息的每个组合加入一行。因此,对于包含5笔付款和3笔订单详细信息的订单,将有15行,因此付款是3笔订单详细信息的3倍
考虑以下示例,使用SQL,但删除了Total Aggregate函数,因此可以看到行:
DROP TABLE IF EXISTS Payments;
DROP TABLE IF EXISTS OrderDetails;
DROP TABLE IF EXISTS Orders;
CREATE TABLE [Orders] (
[OrderId] text NOT NULL COLLATE NOCASE
,PRIMARY KEY ([OrderId])
);
CREATE TABLE [OrderDetails] (
[OrderDetailId] text NOT NULL COLLATE NOCASE
,[OrderId] text NOT NULL COLLATE NOCASE
,PRIMARY KEY ([OrderDetailId])
FOREIGN KEY ( [OrderId]) REFERENCES [Orders]( [OrderId] )
);
CREATE TABLE [Payments] (
[OrderId] text NOT NULL COLLATE NOCASE
,[PaymentAmount] numeric NOT NULL
,[PaymentDate] datetime NOT NULL
,[PaymentId] text NOT NULL COLLATE NOCASE
,PRIMARY KEY ([PaymentId])
FOREIGN KEY ( [OrderId]) REFERENCES [Orders]( [OrderId] )
);
INSERT INTO Orders VALUES ('Order1'),('Order2'),('Order3');
INSERT INTO OrderDetails VALUES
('OrderDetail001','Order1'),('OrderDetail002','Order1'),('OrderDetail003','Order1'),
('OrderDetail010','Order2'),
('OrderDetail020','Order3')
;
INSERT INTO Payments VALUES
('Order1',10,datetime('now'),'PayOrder1001'),
('Order1',15,datetime('now'),'PayOrder1002'),
('Order1',5,datetime('now'),'PayOrder1003'),
('Order1',12,datetime('now'),'PayOrder1004'),
('Order1',8,datetime('now'),'PayOrder1005'),
('Order2',10,datetime('now'),'PayOrder2001'),
('Order2',7,datetime('now'),'PayOrder2002'),
('Order2',5,datetime('now'),'PayOrder2003')
;
SELECT
TOTAL(PaymentAmount) AS Paid
FROM Orders LEFT JOIN Payments ON Orders.OrderId=Payments.OrderId
;
SELECT
/* TOTAL(PaymentAmount) AS Paid */ *
FROM Orders LEFT JOIN Payments ON Orders.OrderId=Payments.OrderId
LEFT JOIN OrderDetails ON Orders.OrderId=OrderDetails.OrderId
;
SELECT
TOTAL(PaymentAmount) AS Paid
FROM Orders LEFT JOIN Payments ON Orders.OrderId=Payments.OrderId
LEFT JOIN OrderDetails ON Orders.OrderId=OrderDetails.OrderId
;
在这种情况下,订单1的付款总额为72 50,订单2的付款总额为22,这反映在您的第一次查询中,根据:-
第二个查询小于Total Aggregate函数,因此显示提取的行:-
正如您所看到的,同一笔付款的订单付款数量与订单详细信息数量相同,这是为什么
如果你把所有的付款加起来就是3*50+22=172
根据您的第三个查询:-
对于一个订单,您可能有多个orderdetails,因此订单行以及付款都会多次出现在订单中result@derpirscher你说得对。每个订单通常有多个详细信息。但是,我确实需要从订单详细信息中检索信息,所以我确实需要加入。当我包含订单详细信息联接时,如何获得正确的付款总额?发布示例数据和预期结果,以澄清您的要求。您说的第一个查询返回正确的结果,只返回1行1列:PaymentAmount总额。为什么要加入OrderDetails?如果你想从新的查询中获得更多信息,你必须发布你预期的结果。我正试图使一个复杂的查询保持简单,以便关注这个问题。我不认为加入订单细节的原因是相关的,但举例来说,我还想了解订单细节。在这种情况下,我希望返回付款总额和订单详细信息计数。那么,您将如何构造一个确实需要对订单详细信息进行联接的查询呢。例如,假设我必须返回付款总额和订单详细信息的计数?要简单地返回订单详细信息的计数,您可以不使用“选择TOTALPaymentAmount AS Paymed”进行连接,从OrderDetails中选择count*作为OrderDetailCount从Orders LEFT加入订单上的付款。OrderId=payments.OrderId;结果=172和5。你可能想读一读。您可以使用CTE的and或Windows函数执行更复杂、可能有用的查询。