因此,我知道连接和查询三个表之前已经被询问过,但是我的情况和查询有些不同,其他解决方案无法满足我的需求。
因此,我有三个表,第一个表进行主排序/过滤,并且没有主键,其他两个表中包含大多数信息,并且使用主键(“站点”)。 / p>
我想从第一个表中获取站点列表,然后根据结果将所有三个表进行内部联接。
我可以使用for
循环在Python中执行此操作,但我想有一种更好/更简洁的方法。
这是python代码:
q1 = "Select * from Drive where Origin='Seattle,WA' and Hour<3"
q2 = "Select * from Weather Inner Join Site On Weather.Site = Site.Site where Weather.Site='%s'"
for line in conn.execute(q1): # This gets all the Sites from the first table
print(line) # This prints the first table results
print(conn.execute(q2 % line[0]).fetchone()) # This does the Join for the other two tables and prints the results from the two tables
这确实有效,我可以在我的应用程序中使用它,但这感觉有点残酷,我敢肯定还有另一种/更好的方法。
我遇到问题的地方是返回所有三个表的每一列,并在第一个查询中返回where子句。
作为后续问题,我想在Site表上再放置一个“ Where子句”?
类似的东西:
q2 = "Select * from Site where Site.HasWater=1 Inner Join Weather On Site.Site = Weather.Site where Weather.Site='%s'"
我们总是感谢您的帮助,谢谢。
已使用相关架构更新
3个数据库-云端硬盘,天气,站点
Drive - Site, Origin, Hour, Drive
Site - Site, LatLong, HasWater, etc. and about 15 other columns
Weather - Site, RainFall, etc. and 10 other columns
站点是表中的主键:“站点”和“天气”-但不是云端硬盘中的主键,因为“站点”列不像表“天气”和“站点”中那样包含唯一信息。
例如,这是驱动器表的外观
Site | Origin | Hour | Drive
Site 1, City 1, 2, 02:30:30
Site 1, City 2, 4, 04:45:57
Site 1, City 3, 1, 01:19:22
Site 2, City 1, 0, 00:56:34
Site 2, City 2, 1, 01:38:06
Site 2, City 3, 2, 02:23:41
因此,第一个查询是通过“起点”和“小时”来缩小站点的数量-然后第二个查询是获取每个站点的所有信息。
我希望有帮助。
答案 0 :(得分:2)
我相信以下内容可能与您正在寻找的内容相似
SELECT drive.site, drive.origin, drive.hour, drive.drive, latlong, haswater, rainfall
FROM drive
JOIN weather ON weather.site = drive.site
JOIN site ON site.site = drive.site
WHERE drive.hour < 3 AND site.haswater > 0
;
以上内容基于以下用于填充表的内容:-
DROP TABLE IF EXISTS drive;
DROP TABLE IF EXISTS site;
DROP TABLE IF EXISTS weather;
CREATE TABLE IF NOT EXISTS drive (site TEXT, origin TEXT, hour INTEGER, drive TEXT);
CREATE TABLE IF NOT EXISTS site (site TEXT PRIMARY KEY, latlong REAL, haswater INTEGER);
CREATE TABLE IF NOT EXISTS weather (site TEXT PRIMARY KEY, rainfall REAL);
INSERT INTO drive VALUES
('Site 1', 'City 1', 2, '02:30:30'),
('Site 1', 'City 2', 4, '04:45:57'),
('Site 1', 'City 3', 1, '01:19:22'),
('Site 2', 'City 1', 0, '00:56:34'),
('Site 2', 'City 2', 1, '01:38:06'),
('Site 2', 'City 3', 2, '02:23:41')
;
INSERT INTO site VALUES ('Site 1',10.5,1),('Site 2', 65.5,0);
INSERT INTO weather VALUES('Site 1', 23.45),('Site 2',12.6);
结果将是:-
,或者没有附加的WHERE子句(即,否AND site.haswater = 1
)