如果进行JOIN,则GROUP BY列仅出现在一个表中(使用两个表)

时间:2018-08-05 13:00:54

标签: mysql sql

这给出了一个错误:

SELECT 
    customerName, customerNumber, SUM(amount)
FROM
    customers
        LEFT JOIN
    payments USING (customerNumber)
GROUP BY customers.customerName
ORDER BY customerName;

但是'GROUP BY customer.customerNumber'给出正确的结果。

注意:两个表中都存在'customerNumber',但没有'customerName'。

表“客户”的列:

customerNumber int(11) **PK** 
customerName varchar(50) 
contactLastName varchar(50) 
contactFirstName varchar(50)

“付款”表的列:

customerNumber int(11) **PK** 
checkNumber varchar(50) **PK** 
paymentDate date 
amount decimal(10,2)

这是我们可以在两个表中都存在JOIN BY的GROUP BY列的约束吗?

3 个答案:

答案 0 :(得分:0)

您的问题

这是我们可以限制两个表中都存在的GROUP BY列的约束吗? 答:没有这样的规则

我认为以下内容将为您服务,聚合函数的规则是您要投影的列数也必须位于group by

SELECT 
        c.customerName, c.customerNumber, SUM(amount)
    FROM
        customers c
            LEFT JOIN
        payments p on c.customerNumber=p.customerNumber
    GROUP BY c.customerName,c.customerNumber
    ORDER BY customerName;

答案 1 :(得分:0)

没有这样的约束。我通常会建议在GROUP BY子句中包括所有未聚合的列:

GROUP BY customerName, customerNumber

(您应该使用别名,但这与该问题无关。)

SQL通常需要。除了一个例外。如果一个(或多个)列是唯一列或主键,则可以执行以下操作:

SELECT c.*                 -- any or all the columns
. . .
GROUP BY c.customerNumber  -- unique or primary key

这解释了为什么此公式有效。但是,customerName既不是unique也不是primary key,所以这是一个错误。

注意:MySQL的较早版本没有施加此约束,因此您可以在聚合查询的GROUP BYSELECT子句中放置任何内容。

答案 2 :(得分:-1)

否,您可以在Join中任何表的任何列上使用Group By。并没有要求该列必须出现在两个表中。

GROUP BY customers.customerName会导致什么错误?