SQL SERVER消息8120,级别16,状态1

时间:2016-09-01 18:32:49

标签: php sql-server codeigniter

只是不明白为什么我必须聚合每一个表列只是为了让SQL SERVER看起来相反。这很难理解。我为什么要这样做:

$this->db->select("MAX(c.id),MAX(c.name),MAX(c.phone)");
$this->db->select('MAX(state.name) as st_nm');
$this->db->select('MAX(lga.name) as "lga_nm"');
$this->db->select('MAX(cp2.point_name),MAX(cp2.location)');
$this->db->select('SUM(pr.amount) as "amt"');
$this->db->from('consultant as c');
$this->db->join('state','state.id=c.state','inner');
$this->db->join('lga','lga.id=c.lga','inner');
$this->db->join('collection_point2 as cp2','cp2.point_code=c.collection_point','inner');
$this->db->join('payment_records as pr','pr.consultant_id=c.unique_id','inner');
$this->db->where('c.agent_id',$agent);
$this->db->group_by('c.id');
$this->db->order_by('c.id');   

为了避免这种情况:

Msg 8120, Level 16, State 1, Line 1 Column ... is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

1 个答案:

答案 0 :(得分:0)

我知道,你总会遇到这样的情况:你脑子里会有同样的问题。为什么所有列都需要它?

您的选择:

  1. 将您的聚合逻辑分开,不要在一个查询中抛出所有列。所以说,只让一个查询从顾问和&amp ;;中回报你" c.id,SUM(pr.amount)。付款记录"。

  2. 使用上表连接其他表(state,lga,consultant),并且此查询的任何列都不需要聚合。

  3. 我建议比较这些查询的性能时间,并根据性能决定。

    推理:这就是"分组的方式。条款设计。虽然实际情况会拖延开发人员构建如此荒谬的查询,其中聚合应用于每一列只是为了使其吐出所需的数据。