sqlite 从另一个表的列生成的列

7xllpg7q  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(165)

Transaction表:
ID|名称|价格|支付金额
-|-|
1|布鲁斯·韦恩|10.0|5.0
2|Lois Lane|33.33|22.22
3|克拉克·肯特|44.4|44.4
4|布鲁斯·韦恩|15.0|20.0
Person表:
ID|名称|总价|已支付总价|到期付款
-|
1|布鲁斯·韦恩|25.0|25.0|0.00
2|Lois Lane|33.33|22.22|11.11
3|克拉克·肯特|44.4|44.4|0.00
Transaction表连接到应用程序,Person表有IDNamePaymentDue列计算TotalPrice - TotalPaidTotalPriceTotalPaid列都为空,其缺省值为0.00
我想从Transaction表的PriceAmount Paid列生成/更新TotalPriceTotalPaid,其中Transaction.Name = Person.Name
我正在尝试使用以下命令创建表格:

CREATE TABLE "Person" (
    "ID"    INTEGER NOT NULL UNIQUE,
    "Name"  TEXT,
    "TotalPrice"    REAL AS (SUM("main.Transaction.Price") WHERE "main.Transaction.Name" = "Name"),
    "TotalPaid" REAL DEFAULT 0.00,
    "PaymentDue"    REAL NOT NULL AS ("TotalPrice" - "TotalPaid"),
    PRIMARY KEY("ID" AUTOINCREMENT)
);

它给出了一个错误:
执行已完成,但出现错误。RESULT:NEAR“WHERE”:第1行出现语法错误:CREATE TABLE“Person”(“ID”INTEGER NOT NULL UNIQUE,“NAME”Text,“TotalPrice”REAL AS(sum(“main.Transaction.Price”)where
我还试过:

"TotalPrice"    REAL AS (SELECT SUM("main.Transaction.Price") WHERE "main.Transaction.Name" = "Name"),

错误:
执行已完成,但出现错误。结果:接近“SELECT”:第1行出现语法错误:CREATE TABLE“Person”(“ID”INTEGER NOT NULL UNIQUE,“NAME”Text,“TotalPrice”REAL AS(SELECT
另请注意:

"TotalPrice"    REAL AS (SUM(t.Price) FROM Transaction t WHERE "main.Transaction.Name" = "Name"),

错误:
接近“from”语法错误
这个应用程序是检查客户/供应商付款和库存管理。我使用以下命令创建了Person表:

CREATE TABLE "Person" (
    "ID"    INTEGER NOT NULL UNIQUE,
    "Name"  TEXT,
    "TotalPrice"    REAL DEFAULT 0.00,
    "TotalPaid" REAL DEFAULT 0.00,
    "PaymentDue"    REAL NOT NULL AS ("TotalPrice" - "TotalPaid"),
    PRIMARY KEY("ID" AUTOINCREMENT)
);

Transaction表:

CREATE TABLE "Transaction" (
    "ID"    INTEGER NOT NULL UNIQUE,
    "Name"  TEXT,
    "Price" REAL  NOT NULL DEFAULT 0.00,
    "AmountPaid"    REAL NOT NULL DEFAULT 0.00,
    PRIMARY KEY("ID" AUTOINCREMENT)
);

我可以执行更新查询,但不知道如何使用SUM()

2fjabf4q

2fjabf4q1#

您正在尝试创建一个生成的列,但这是不可能的,因为该表达式引用了另一个表的列(更不用说它对该列进行了聚合)。
此约束记录在生成的列/功能中:
生成的列的表达式可以引用表中的任何其他声明列,包括其他生成的列,只要该表达式不直接或间接引用其自身。
所以,这些表达方式:

SUM("main.Transaction.Price") WHERE "main.Transaction.Name" = "Name"

SELECT SUM("main.Transaction.Price") WHERE "main.Transaction.Name" = "Name"

是不允许的。
您应该做的是创建一个View而不是一个表:

CREATE VIEW view_Person AS
SELECT ROW_NUMBER() OVER (ORDER BY Name) ID,
       Name,
       SUM(Price) TotalPrice,
       SUM(AmountPaid) TotalPaid,
       SUM(Price) - SUM(AmountPaid) PaymentDue
FROM "Transaction"
GROUP BY Name;

并通过从视图中进行选择来获得所需的结果集:

SELECT * FROM view_Person;

请参阅demo

wwwo4jvm

wwwo4jvm2#

生成的列的表达式只能引用同一行中的常量文字和列,并且只能使用标量确定性函数。该表达式不能使用子查询、聚合函数、窗口函数或表值函数。
阅读文档https://sqlite.org/gencol.html

相关问题