我有三个表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
和{{ 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 |
+----+---------+--------+-------+
,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
的地方。
答案 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
表中所需的列和结果来澄清您的问题(b
和c
之间没有与{{ 1}})。 word, speech, sense
和a
之间的关系描述也令人困惑。在第一段中,它表示b
。 Table a is related with table b through column key
应该是key
吗?