Sql ";“选举后第一次当选”;查询问题

Sql ";“选举后第一次当选”;查询问题,sql,correlated-subquery,Sql,Correlated Subquery,这个问题看起来像是学校的作业,但事实并非如此。充其量只是自我强加的学校作业。我鼓励任何教师,如果愿意的话,以is为例 “事后第一轮”选举是单轮选举,这意味着无论谁获得最多选票,都不会有第二轮选举 假设有一张选举桌 CREATE TABLE ElectionResults ( DistrictHnd INTEGER NOT NULL, PartyHnd INTEGER NOT NULL, CandidateName VARCHAR2(100) NOT NULL, T

这个问题看起来像是学校的作业,但事实并非如此。充其量只是自我强加的学校作业。我鼓励任何教师,如果愿意的话,以is为例

“事后第一轮”选举是单轮选举,这意味着无论谁获得最多选票,都不会有第二轮选举

假设有一张选举桌

CREATE TABLE ElectionResults (
    DistrictHnd INTEGER NOT NULL,
    PartyHnd INTEGER NOT NULL,
    CandidateName VARCHAR2(100) NOT NULL,
    TotalVotes INTEGER NOT NULL,
    PRIMARY KEY DistrictHnd, PartyHnd);
该表有两个外键:DistrictHnd指向District表(列出所有不同的选区),PartyHnd指向Party表(列出所有不同的政党)。我不想在这里为其他桌子操心,加入它们是微不足道的。这只是一点点的背景

问题是:什么样的SQL查询将返回一个表,列出每个地区的地区HND、PartyHnd、候选名称和得票总数(最大票数)?

这并不假设任何特定的数据库系统。如果您希望坚持使用特定的SQL实现,请选择SQLite和MySQL。如果你能设计出一个更好的模式(或者更简单的模式),这也是可以接受的。标准:简单,可移植到其他数据库

Select DistrictHnd, PartyHnd, CandidateName, TotalVotes
From ElectionResults As ER
Where TotalVotes = (
                    Select Max(ER1.TotalVotes)
                    From ElectionResults As ER1
                    Where ER1.DistrictHnd = ER.DistrictHnd
                    )
在这个查询中,如果有一个平局(两个人在同一地区拥有相同的总票数),他们都会显示出来


在此查询中,如果出现平局(同一地区的两个人拥有相同的总票数),他们将同时显示。

要使用SQL Server 2005或更高版本中的窗口功能执行此操作,请执行以下操作:

;WITH Results_CTE AS
(
    SELECT
        DistrictHnd, PartyHnd, CandidateName, TotalVotes,
        ROW_NUMBER() OVER
        (
            PARTITION BY DistrictHnd
            ORDER BY TotalVotes DESC
        ) AS RowNum
    FROM ElectionResults
)
SELECT DistrictHnd, PartyHnd, CandidateName, TotalVotes
FROM Results_CTE
WHERE RowNum = 1
可能比相关子查询更快,只需要排序和扫描


注意:在领带的情况下,这只会让你得到第一个条目,它将被任意选择。如果要在出现结的情况下检索所有行(这在这里可能有意义),请使用SQL Server 2005或更高版本中的窗口功能将
ROW_NUMBER()
更改为
RANK()

;WITH Results_CTE AS
(
    SELECT
        DistrictHnd, PartyHnd, CandidateName, TotalVotes,
        ROW_NUMBER() OVER
        (
            PARTITION BY DistrictHnd
            ORDER BY TotalVotes DESC
        ) AS RowNum
    FROM ElectionResults
)
SELECT DistrictHnd, PartyHnd, CandidateName, TotalVotes
FROM Results_CTE
WHERE RowNum = 1
可能比相关子查询更快,只需要排序和扫描


注意:在领带的情况下,这只会让你得到第一个条目,它将被任意选择。如果你想在打成平局的情况下检索所有行(这在这里可能有意义),请将
ROW\u NUMBER()
更改为
RANK()

哦,太糟糕了!这种类型的查询又叫什么?它被称为关联子查询,其中内部查询中的某些内容引用了外部查询中的一列。谢谢。这正是我要找的。哦,太糟糕了!这种类型的查询又叫什么?它被称为关联子查询,其中内部查询中的某些内容引用了外部查询中的一列。谢谢。这正是我想要的。习惯的力量。作为一般规则,我使用ID表示任何形式的可识别整数,Hnd表示任何可能是自动递增的内部变量。习惯的力量。作为一般规则,我使用ID表示任何形式的可识别整数,Hnd表示任何可能是自动递增的内部变量。