我希望能够联接两个表,在这些表中,列值之间存在映射关系,而不是它们的值匹配。
因此,而不是:
A|m | f B|m | f
a1 1 b1 1
a2 2 b2 3
a3 3 b3 5
SELECT a1, a2, b1, b2 FROM A INNER JOIN B on B.f = A.f
给予:
|m| A.f B.f |m|
a1 1 1 b1
a3 3 3 b2
给出然后映射(1-> a)(2-> b)(3-> c)
A|m | f B|m | f
a1 1 b1 a
a2 2 b2 b
a3 3 b3 c
在加入f时给予:
|m| A.f B.f |m|
a1 1 a b1
a3 3 c b2
下面的问题似乎正在尝试类似的操作,但是它们似乎想要更改列值,我只希望mappng成为查询的一部分,而我自己不想更改列值。除此之外,它在R中,而我在Python中工作。
答案 0 :(得分:1)
一种解决方案是创建一个临时映射表AB
:
CREATE TEMP TABLE AB (a TEXT, b TEXT, PRIMARY KEY(a, b));
然后插入映射,
INSERT INTO temp.AB VALUES (1, "a"), (2, "b"), (3, "c");
或executemany(带有参数)。
然后使用中介表进行选择。
SELECT A.m AS Am, A.f AS Af, B.f AS Bf, B.m AS Bm
FROM A
LEFT JOIN temp.AB ON A.f=AB.a
LEFT JOIN B ON B.f=AB.b;
如果您不想创建中间表,另一种解决方案是自己构建查询。
mappings = ((1,'a'), (3,'c'))
sql = 'SELECT A.m AS Am, A.f AS Af, B.f AS Bf, B.m AS Bm FROM A, B WHERE ' \
+ ' OR '.join(['(A.f=? AND B.f=?)'] * len(mappings))
c.execute(sql, [i for m in mappings for i in m])