我需要返回所有m_id,其中cli_id有false cli_billstat。然后我需要按cli_id的最大计数排序到最小。
我的查询返回我需要的信息,但我不能得到它的cli_id我想要的方式。
我代码:
SELECT CLIENT.CLI_ID, CLI_FNAME, CLI_LNAME, CLI_BILLSTAT, M_ID, M_DATE
FROM CLIENT, MEETING
WHERE CLIENT.CLI_ID = MEETING.CLI_ID
AND CLI_BILLSTAT = False
GROUP BY CLIENT.CLI_ID, CLI_FNAME, CLI_LNAME, CLI_BILLSTAT, M_ID, M_DATE\
in the cli_id column it returns
cli_id
10
10
14
21
21
21
what I need is something like:
cli_id
21
21
21
10
10
14
22
我试过添加COUNT(client.cli_id)作为COUNT然后ORDER BY COUNT,但是它没有改变结果。
必须使用子查询,实质上是重复连接查询,如下所示:
select
S1.CLI_ID,
S1.CLI_FNAME,
S1.CLI_LNAME,
S1.CLI_BILLSTAT,
S1.M_ID,
S1.M_DATE,
S1.Cnt
from
(SELECT ClntA.CLI_ID,
ClntA.CLI_FNAME,
ClntA.CLI_LNAME,
ClntA.CLI_BILLSTAT,
MtgA.M_ID,
MtgA.M_DATE,
(select count(*)
from CLIENT ClntB
Inner Join
MEETING MtgB
on ClntB.CLI_ID = MtgB.CLI_ID
WHERE ClntB.CLI_BILLSTAT = False
AND ClntB.cli_id=ClntA.cli_id) as Cnt
FROM
CLIENT ClntA
Inner Join
MEETING MtgA
on ClntA.CLI_ID = MtgA.CLI_ID
WHERE ClntA.CLI_BILLSTAT = False
) S1
order by S1.cnt desc, S1.cli_id;
在大多数其他现代dbms产品中,这可以通过窗口函数实现,但MsAccess SQL缺乏窗口函数。
如果CLI_ID是CLIENT表的主键,可以显著缩短子查询。如果是这种情况,子查询只能计数来自MEETING的MtgB.CLI_ID=ClntA的记录。CLI_ID(在子查询中不需要JOIN或WHERE CLI_BILLSTAT)