具有内部联接的SQL分组依据

具有内部联接的SQL分组依据,sql,Sql,MS Access已生成以下查询: SELECT Port.portName, Auth.portID, Region.RegionName, Region.RegionID, Auth.authID FROM Region INNER JOIN (Auth INNER JOIN Port ON Auth.portID = Port.portID) ON Region.RegionID = Port.RegionID; 我想 GROUP BY Region.Re

MS Access已生成以下查询:

SELECT Port.portName, Auth.portID, 
    Region.RegionName, Region.RegionID, 
    Auth.authID
FROM Region 
INNER JOIN (Auth INNER JOIN Port ON Auth.portID = Port.portID) 
    ON Region.RegionID = Port.RegionID;
我想

GROUP BY Region.RegionID

当我将它添加到末尾时,它告诉我PortName不是聚合函数的一部分。someplete plase能告诉我怎么做吗?我尝试在SQL中的不同点插入它,但似乎不起作用。

正在尝试这样做吗?:

SELECT Region.RegionID, Region.RegionName, Port.portName, Auth.authID
FROM Auth
INNER JOIN Port ON Port.portID = Auth.portID 
INNER JOIN Region ON Region.RegionID = Port.RegionID
ORDER BY Region.RegionID

从您的评论中,我相信您的意思是使用
DISTINCT
关键字,而不是像这样使用
groupby

SELECT DISTINCT Port.portName, 
Auth.portID, 
Region.RegionName, 
Region.RegionID, 
Auth.authID
FROM Region 
INNER JOIN Port ON Region.RegionID = Port.RegionID
INNER JOIN Auth ON Auth.portID = Port.portID);
试试这个

选择Port.portName、Auth.portID、Region.RegionName、Region.RegionID、Auth.authID 来自区域上的区域内部连接验证。RegionID=Auth.portID内部连接端口位于
Port.portID=Auth.portID按Port.portName、Auth.portID、Region.RegionName、Region.RegionID、Auth.authID分组

这将选择每个区域id最大的端口

SELECT 
    Port.portName, 
    Auth.portID, 
    Region.RegionName, 
    Region.RegionID, 
    Auth.authID
FROM Region 
INNER JOIN Port ON Region.RegionID = Port.RegionID
INNER JOIN Auth ON Auth.portID = Port.portID
INNER JOIN (
    SELECT max(Port.portID) max_portID, Port.RegionID
    FROM Port
    GROUP BY Port.RegionID
) t1 ON t1.RegionID = Port.RegionID AND t1.max_portID = Port.portID
上面的查询假设每个
端口只有一个
Auth
,但是如果每个
端口可以有多个
Auth
,您同样需要只选择max
Auth
,以避免结果中出现重复区域

SELECT 
    Port.portName, 
    Auth.portID, 
    Region.RegionName, 
    Region.RegionID, 
    Auth.authID
FROM Region 
INNER JOIN Port ON Region.RegionID = Port.RegionID
INNER JOIN Auth ON Auth.portID = Port.portID
INNER JOIN (
    SELECT max(Port.portID) max_portID, Port.RegionID
    FROM Port
    GROUP BY Port.RegionID
) t1 ON t1.RegionID = Port.RegionID AND t1.max_portID = Port.portID
INNER JOIN (
    SELECT max(Auth.authID) max_authID, Auth.portID
    FROM Auth
    GROUP BY Auth.portID
) t2 ON t2.portID = Port.portID AND t2.max_authID = Auth.authID

为什么要按区域添加
组。RegionID
?因为你没有做任何聚合。按某个东西分组的整个想法意味着你在聚合其他东西。例如,每个部门的总美元数,您可以按部门分组,并按美元求和。按部门分组而不按美元求和是没有意义的。您想做什么?正如您可能已经注意到的,我不太擅长SQL。基本上,当我运行查询时,将有多个条目具有相同的区域ID,我想更改此设置,使其仅列出相同的唯一ID一次。您不需要将所选属性包含在聚合函数中或
GROUP BY
子句中吗?如果您希望每个区域有一行,您希望如何处理每个区域都有多个端口这一事实?您是否希望将第一个(最小)、最后一个(最大)都放在一个聚合列表中(我不相信access有函数,但通常您会使用group_concat、listagg、string_agg等)。每个区域都有多个端口,因此您必须以某种方式聚合这些端口,每个区域有一行。这不是重复而是给出正确的结果。因为您有一个类似于
Region.RegionID=Port.RegionID
的关系;可能是
Region.RegionID 1
与多个端口
Port.RegionID 1 2 3
相关,在这种情况下,连接它们将获取多个记录,其中
Region.RegionID
将重复。