【问题标题】:Combine instructions with a subquery in SQLite在 SQLite 中将指令与子查询结合起来
【发布时间】:2017-06-27 19:07:34
【问题描述】:

我有一个如下所示的 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]

现在我想将生成的列idID_TABLE 中ID_TABLE.number LESS THAN 26 的对应列number 匹配。结果应该是(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]

如何通过结合新指令与以前的指令来在一个查询中完成所有操作

【问题讨论】:

    标签: sql database sqlite subquery


    【解决方案1】:

    您需要执行 JOIN,然后稍微修改您的分组以保持聚合函数正常工作。假设在points_apoints_b 中的每个对应记录,在id_table 中只有一条记录:

    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;
    

    【讨论】:

      【解决方案2】:

      这看起来很简单,将您的原始查询用作子查询。这不是给你你想要的吗?

      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;
      

      【讨论】:

        猜你喜欢
        • 2014-12-23
        • 1970-01-01
        • 2014-06-18
        • 2013-11-27
        • 2020-08-03
        • 1970-01-01
        • 2011-11-17
        • 2020-06-08
        • 1970-01-01
        相关资源
        最近更新 更多