Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加联接条件时,SQLite总查询数增加_Sqlite - Fatal编程技术网

添加联接条件时,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

我正在尝试使用这个简化的模式从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 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函数执行更复杂、可能有用的查询。