Условное внутреннее объединение в sqlite python - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть три таблицы a, b и c.Таблица a связана с таблицей b через столбец key.Таблица b связана с таблицей c через столбцы word, sense и speech.Кроме того, таблица c содержит столбец id.

Теперь некоторые строки в a.word не имеют совпадающего значения с b.word, исходя из того, что я хочу inner join таблиц при условии, если a.word= b.word, затем присоединяйтесь, в противном случае сравните только a.end_key = b.key.

В результате я хочу получить таблицу в форме a с дополнительными столбцами start_id и end_id изc соответствует key_start и key_end.

Я попробовал следующую команду sql с python:

CREATE TABLE relations 
              AS
              SELECT * FROM 
                  c
              INNER JOIN 
                  a
              INNER JOIN
                  b
              ON 
                  a.end_key =  b.key
              AND
                  a.start_key = b.key
              AND
                  b.word = c.word
              AND
                  b.speech = c.speech
              AND
                  b.sense = c.sense
              OR
                  a.word  = b.word

a:

+-----------+---------+------+-----------+
| key_start | key_end | word | relation  |
+-----------+---------+------+-----------+
| k5        | k1      | tree | h         |
| k7        | k2      | car  | m         |
| k200      | k3      | bad  | ho        |
+-----------+---------+------+-----------+

b:

+-----+------+--------+-------+
| key | word | speech | sense |
+-----+------+--------+-------+
| k5  | sky  | a      |     1 |
| k2  | car  | a      |     1 |
| k3  | bad  | n      |     2 |
+-----+------+--------+-------+

c:

+----+---------+--------+-------+
| id |  word   | speech | sense |
+----+---------+--------+-------+
|  0 | light   | a      |     1 |
|  0 | dark    | b      |     3 |
|  1 | neutral | a      |     2 |
+----+---------+--------+-------+

Изменить для уточнения:

Значения таблиц a, b и c содержат сотни тысяч строк, поэтомув таблицах есть совпадающие значения.Таблица a относится к таблице b с отношением end_key ~ key и start_key ~ key.Таблица b относится к c - word sense и speech, в каждом из этих столбцов есть значения, которые совпадают.

Требуемая таблица находится в форме

start_id | key_start | key_end | end_id | relation

Где start_id соответствует key_start и key_end соответствует end_id.

1 Ответ

0 голосов
/ 25 ноября 2018

РЕДАКТИРОВАТЬ новый ответ Проблема с предложенным запросом заключается в использовании AND и OR (и, вероятно, отсутствует (...)).Это утверждение

a.word = b.word, затем присоединитесь, в противном случае сравните только a.end_key = b.key.

будет переводиться в:

AND (a.word= b.word OR a.end_key = b.key).

Может быть, попробуйте это так:

         ON 
              b.word = c.word
          AND
              b.speech = c.speech
          AND
              b.sense = c.sense
          AND 
              (a.word  = b.word OR a.end_key = b.key)


Было бы неплохо проверить в менеджере sqlite (например, в командной строке sqlite3, DB Browser для sqlite)прежде чем попробовать это в python;Устранение неполадок намного проще.И, конечно, протестируйте SELECT перед тем, как внедрить его в CREATE TABLE.

. Вы можете уточнить свой вопрос, показав нужные столбцы и приведя таблицу relations, которую создаст этот пример данных (естьничего между b и c, которое бы соответствовало word, speech, sense).Также описание отношений между a и b сбивает с толку.В первом абзаце написано Table a is related with table b through column key.key должно быть word?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...