SQLite连接列上的值映射

时间:2019-07-19 10:41:47

标签: python-3.x sqlite join

我希望能够联接两个表,在这些表中,列值之间存在映射关系,而不是它们的值匹配。

因此,而不是:

 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中工作。

Mapping column values

1 个答案:

答案 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])