sqlite python中的条件内联接

时间:2018-11-25 09:12:42

标签: python-3.x sqlite

我有三个表abc。 表a通过列b与表key相关。 表b通过列cwordsense与表speech相关。另外,表c包含列id

现在,基于此,a.word中的某些行与b.word没有匹配值 我想以inner join表为条件,如果a.word = b.word然后加入,否则仅比较a.end_key = b.key。

因此,我希望使用a形式的表,其中start_id中的end_idc的额外列与key_start和{{ 1}}。

我尝试使用python执行以下sql命令:

key_end

a:

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

b:

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

c:

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

为澄清起见进行编辑:

+----+---------+--------+-------+ | id | word | speech | sense | +----+---------+--------+-------+ | 0 | light | a | 1 | | 0 | dark | b | 3 | | 1 | neutral | a | 2 | +----+---------+--------+-------+ ab的值包含数十万行,因此表中有匹配的值。表c与具有abend_keykey关系的表start_key相关。表keybc wordsense相关,在每列中都有匹配的值。

所需表格的形式

speech | start_id | key_start | key_end | end_id

relation匹配start_id,而key_start匹配key_end的地方。

1 个答案:

答案 0 :(得分:0)

编辑新答案 提出的查询的问题在于使用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)


在python中尝试之前,最好在sqlite管理器(例如,命令行sqlite3,用于sqlite的数据库浏览器)中进行测试;故障排除要容易得多。当然,在将SELECT应用于CREATE TABLE之前,请对其进行测试。

您可以通过显示此示例数据将创建的relations表中所需的列和结果来澄清您的问题(bc之间没有与{{ 1}})。 word, speech, sensea之间的关系描述也令人困惑。在第一段中,它表示bTable a is related with table b through column key应该是key吗?