从另一个查询的结果内部联接三个表

时间:2019-02-17 22:47:32

标签: sqlite android-sqlite

因此,我知道连接和查询三个表之前已经被询问过,但是我的情况和查询有些不同,其他解决方案无法满足我的需求。

因此,我有三个表,第一个表进行主排序/过滤,并且没有主键,其他两个表中包含大多数信息,并且使用主键(“站点”)。 / 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

因此,第一个查询是通过“起点”和“小时”来缩小站点的数量-然后第二个查询是获取每个站点的所有信息。

我希望有帮助。

1 个答案:

答案 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
;
  • 请注意添加了其他WHERE子句

以上内容基于以下用于填充表的内容:-

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);

结果将是:-

enter image description here

,或者没有附加的WHERE子句(即,否AND site.haswater = 1

enter image description here