Внутреннее объединение трех таблиц из результатов другого запроса - PullRequest
0 голосов
/ 18 февраля 2019

Итак, я знаю, что объединение трех таблиц задавалось и отвечало раньше, но моя ситуация и запрос немного отличаются, и другие решения не работают для моих нужд.

Итак, у меня есть три таблицы, первая таблица выполняет первичную сортировку / фильтрацию и не имеет первичного ключа, две другие таблицы содержат большую часть информации и используют первичный ключ («Сайт»).).

Я хотел бы получить список сайтов из первой таблицы, а затем объединить все три таблицы на основе результатов.

Я могу сделать это в Python, используя цикл for, но я думаю, что есть лучший / более лаконичный способ сделать это.

Вот код 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 в первом запросе.

И в качестве последующего вопроса скажем, что я хотел поставить еще одно предложение 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 голосов
/ 18 февраля 2019

Я полагаю, что следующее может быть таким, как вы ищетеСледующее используется для заполнения таблиц: -

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

или без дополнительного ГДЕпункт (т.е. не AND site.haswater = 1)

enter image description here

...