【问题标题】:Sqlite join columns on mapping of values关于值映射的 Sqlite 连接列
【发布时间】:2019-07-19 10:41:47
【问题描述】:

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

所以而不是:

 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

【问题讨论】:

    标签: python-3.x sqlite join


    【解决方案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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2012-01-06
      相关资源
      最近更新 更多