将指令与SQLite中的子查询结合使用

时间:2017-06-27 19:07:34

标签: sql database sqlite subquery

我有一个SQLite表,如下所示:

   ID_TABLE          POINTS_A_TABLE       POINTS_B_TABLE
  id   number       id_a   points_a      id_b   points_b
--------------     ----------------     ----------------
 smith   1         smith     11         smith      25
 gordon  22        gordon    11         gordon     NULL
 butch   3         butch     11         butch      26
 sparrow 25        sparrow   NULL       sparrow    44
 white   76        white     46         white      NULL

使用以下命令

SELECT id,
       avg(points_a)
FROM (SELECT id_a AS id, points_a FROM points_a_table
      UNION ALL
      SELECT id_b AS id, points_b FROM points_b_table)
GROUP BY id
ORDER BY avg(points_a) DESC;

我能够获得与每个名称相关联的平均点数(more details here

 id    avg(points_a)
white     46.0  [(46+0)/2]
sparrow   44.0  [(0+44)/2]
butch     18.5  [(11+26)/2]
smith     18.0  [(11+25)/2]
gordon    11.0  [(11+0)/2]

现在,我希望将结果列idnumber中ID_TABLE.number低于26 的相应列ID_TABLE进行匹配。结果应该是(number|average):

76 46.0 [(46 + 0)/ 2]

25    44.0  [(0+44)/2]
3     18.5  [(11+26)/2]
76    18.0  [(11+25)/2]
22    11.0  [(11+0)/2]

我如何通过结合新指令与以前的指示,在一个查询中完成

2 个答案:

答案 0 :(得分:1)

这看起来很简单,使用原始查询作为子查询。这不能给你你想要的东西吗?

SELECT
    idt.number,
    avg_points
FROM
    id_table AS idt
    INNER JOIN (
        SELECT id,
             avg(points_a) AS avg_points
        FROM (SELECT id_a AS id, points_a FROM points_a_table
            UNION ALL
            SELECT id_b AS id, points_b FROM points_b_table)
        GROUP BY id
        ) as x on x.id=idt.id
WHERE
    idt.number < 26;

答案 1 :(得分:1)

您需要进行JOIN,然后稍微修改您的分组以保持聚合功能正常工作。假设id_tablepoints_a中的每个相应记录points_b中只有一条记录:

SELECT i.number,
       avg(pts.points) AS average_points
FROM (SELECT id_a AS id, points_a AS points FROM points_a_table
      UNION ALL
      SELECT id_b AS id, points_b AS points FROM points_b_table) AS pts
INNER JOIN id_table i ON i.id = pts.id
GROUP BY pts.id, i.number
WHERE i.number < 26 
ORDER BY avg(pts.points) DESC;