我尝试运行一个看起来像这样的.py文件:
import sqlite3
conn = sqlite3.connect('data.db')
c = conn.cursor()
c.executescript("""
UPDATE CorpData
SET OperationID4Counter =
(SELECT COUNT(*)
FROM PlantData JOIN OperationData
ON PlantName LIKE '%' || OperationName
WHERE OperationID IN (SELECT OperationID
FROM ServiceData
WHERE ServiceID = 512)
AND CorpID = CorpData.CorpID)
""")
并收到此错误:sqlite3.OperationalError: ambiguous column name: OperationID
。我猜测这是因为我们加入了PlantData和OperationData,两者都有一个名为OperationID
的列。当我将该行代码更改为WHERE OperationData.OperationID IN (SELECT OperationID
或WHERE PlantData.OperationID IN (SELECT OperationID
时,它会运行,但我在CorpData
列下的OperationID4Counter
表的所有行中最终都为零。
我认为我们已经关闭,但没有雪茄。我认为ON StationName LIKE '%' || OperationName
行的某些内容是不对的,因为当我将其更改为ON StationName LIKE '%house'
时(如果我理解这一点,那么应该将其全部转移到' house'包括Warehouse)我仍然以OperationID4Counter的所有零结束(即使它至少应该计算具有OperationID4的仓库。)
CL。要求提供一些.dump信息,以查看此数据库中正在使用的类型。我没有指定任何东西所以它刚刚使用默认值。另请注意,各个表的列数多于我在示例中显示的列数(但请注意,这些列与此问题无关,因为它们处理与手头问题无关的数据。)例如,一个PlantData表的.dump如下所示:
INSERT INTO "PlantData" VALUES('60015145','0','0','50000000','10000','15','386
8','1000181','30003830','20000560','10000048','Anytown 334 - Unit 3 - Widgit Corp Logistics Center','-1.444E+12','-71312793600','-9.25528E+11','0.5','0.025','4
');
OperationData中的.dump片段如下所示:
INSERT INTO "OperationData" VALUES('20','45','Manufacturing','','0','0','0','0',
'0','','','','','');
来自CorpData的.dump文章看起来像这样:
INSERT INTO "CorpData" VALUES(NULL,0,'1000158','Shapeset',' S',' N',' 500005','
XYZ Consortium',' 20','6','7','1','5','0');
我有4个表 - 其中3个我想在某些条件下从中提取数据以增加计数器,然后将此计数器作为新列添加到第4个。第4个表格,让我们称之为CorpData
(我想添加更多数据)目前看起来像这样,通常有10-50行(注意我用逗号来表示列分隔符):
CorpID, CorpName, Size, Type, PlantCount, OtherCounter1, OtherCounter2, OtherCounter3, OtherCounter4, OtherCounter5
100002, Widgit Corp, G, R, 25, 1, 5, 4, 3, 0
100004, ACME Corp, G, S, 15, 15, 4, 25, 28, 1
值得一提的是CorpID(一种独特的钥匙),PlantCount是该公司有多少工厂(即设施)的柜台。
这些额外数据源表中的第一个,我们称之为OperationData
的数据是这样的,并且大约有50行:
OperationID, OperationName, Description
1, Warehouse, This facility stores items
2, Distribution Center, Items are brought her from Warehouses to be distributed
3, Factory, Goods are manufactured here
第二,ServiceData
有大约700行,看起来像这样:
OperationID, ServiceID
1, 4
1, 25
1, 33
1, 105
1, 19505
1, 32590
2, 4
2, 25
2, 55
2, 199
2, 19505
2, 335679
2, 529934
3, 2
3, 105
3, 55
3, 170
3, 48907
每个ServiceID都在另一个表中解释,但我想搜索一个或两个我将指定的ServiceID,如4和55.
最后一个数据表,我们称之为PlantData
,所有公司的所有工厂都有详细信息,因此它有大约5200行,如下所示:
PlantID, CorpID, CityID, CountryID, PlantName
60000004, 100002, 74900, 34590, Somewhereville 123 - Widgit Corp Warehouse
60000007, 100002, 74878, 34590, Anytown 334 - Unit 3 - Widgit Corp Distribution Center
60000023, 100002, 56799, 23487, Quietville 532 - Unit 4 - Widgit Corp Warehouse
60000027, 100004, 74900, 34590, Somewhereville 544 - Unit 3 - ACME Corp Distribution Center
60000150, 100004, 56799, 23487, Quietville 312 - Unit 2 - ACME Corp Factory
60000155, 100004, 56799, 23487, Quietville 312 - Unit 4 - ACME Corp Warehouse
请注意以下内容:1)此表中的CorpID与我的起始表中的CorpID匹配2)给定CorpID的CorpName将始终显示在PlantName中3)PlantName还包含一个OperationName 4)一个CityID可以有多个公司&# 39; s植物以及同一公司的植物的多个。 4)作为旁注,这只是这个表的一小部分,如果你计算给定的CorpID在这个表中显示的所有时间,它将与该CorpID的PlantCount相同(所以这可以用作检查某种以确保没有错过任何植物。)
我想在CorpData
表中添加两个新列,这两个列都是计数 - 第一个将计算公司拥有ServiceID 4的工厂数量,第二个计数是多少该公司拥有ServiceID 55的工厂。为此,我需要查看长PlantData
表,从每个PlantName中解析出OperationName(来自OperationData
表),检查找到OperationName&#39 ; s对应的OperationID(在OperationData
表中),并查看该ServiceID是否与ServiceID(来自ServiceData
表)一起列出(第一种情况下为4,第二种情况下为55)。
我打算使用sqlite3和我存储在.db文件中的4个表来执行此操作,但是如果您能够说明为什么我应该在sqlite3上使用该选项,我可能会对其他选项开放。
根据这里的示例,我的最终目标是CorpData
表格如下:
CorpID, CorpName, Size, Type, PlantCount, OtherCounter1, OtherCounter2, OtherCounter3, OtherCounter4, OtherCounter5, OperationID4Counter, OperationID55Counter
100002, Widgit Corp, G, R, 25, 1, 5, 4, 3, 0, 3, 1
100004, ACME Corp, G, S, 15, 15, 4, 25, 28, 1, 2, 2
这是因为Widgit Corp有两个仓库和一个配送中心,仓库和配送中心都有OperationID 4,但只有配送中心和工厂有OperationID 55,ACME公司有1个工厂,仓库和配送中心和工厂没有OperationID 4,但它们确实有OperationID 55。
这里有一些我认为可能会让这更棘手的事情:
Unit X -
部分。 OperationName并不总是只有一个字长,而CorpName也可以比两个字更多(或更少)。因此,在PlantName中查找OperationName可能需要查看整个事物而不是试图将其拆分成某种方式来搜索可能包含OperationName的部分。PlantData
表向下工作并计算匹配时,我们必须继续检查另外两个表,以查看是否应计算PlantData
中的行。我担心如果这段代码没有正确构建,它可能会变得很慢。答案 0 :(得分:1)
UPDATE CorpData
SET OperationID4Counter =
(SELECT COUNT(*)
FROM PlantData JOIN OperationData
ON PlantName LIKE '%' || OperationName
WHERE OperationData.OperationID IN (SELECT OperationID
FROM ServiceData
WHERE ServiceID = 4)
AND CorpID = CorpData.CorpID)