当有外键和主键时获得唯一项目?重复项(具有唯一弱键)?
Posted
技术标签:
【中文标题】当有外键和主键时获得唯一项目?重复项(具有唯一弱键)?【英文标题】:Getting unique items when there's a foreign key and a primary key? Repeated item (with unique weak key)? 【发布时间】:2017-02-14 16:43:42 【问题描述】:这是我的“数据”,比如一个城市的票务数据库。
表 A license_no
12345
12376
88888
99999
64646
77777
(注意:我知道这是一张多余的表……假装它还有其他有趣的东西。主键:license_no)
表 B license_no, date_of_offense, 金额, 城市
12345 09/12/15 200 New York
12345 09/13/15 300 London
12345 09/14/15 9999 London
12345 09/20/2016 1000 London
88888 12/12/2002 12 Frankfurt
12376 01/01/2009 86 London
99999 10/10/2012 19 St. Petersburg
64646 10/10/2013 19 St. Petersburg
77777 10/10/2011 20 St. Petersburg
(主键:license_no,外键,date_of_offense)
现在,如果我的问题是我想知道哪个城市的 UNIQUE 人票最多?那将是圣彼得堡,但是当我执行此查询时,如何将 ID:12345 隔离为不同的,这样我就不会将其作为结果返回?
假设我并不总是知道它是 ID:12345,但我更一般地用这个作为例子来询问。我对这些概念没有最好的理解,我的教授也不擅长详细阐述它们......
感谢您的帮助!
【问题讨论】:
你想在date_of_offense的基础上加入吗? license_no 也应该是表 B 中的外键。那么这是有道理的 【参考方案1】:documentation 说:
在任何采用单个参数的聚合函数中,该参数前面都可以有关键字 DISTINCT。在这种情况下,重复元素会在被传递到聚合函数之前被过滤掉。
因此您可以只计算每个城市的许可证,然后添加 DISTINCT:
SELECT city,
count(DISTINCT license_no)
FROM B
GROUP BY city
ORDER BY 2 DESC
LIMIT 1;
【讨论】:
这有点道理,但就语法而言,我将如何使用该计数值? 具体来说,我需要逐个治疗测试哪个组有更多不同的人,比如门票 > 100。门票 > 200 等等。 计数值是结果的第二列。如果你想给它一个名字,使用 AS。您没有要求其他组。 我知道,但我有你在,所以我想问问。谢谢您的帮助。希望我现在能解决这个问题。以上是关于当有外键和主键时获得唯一项目?重复项(具有唯一弱键)?的主要内容,如果未能解决你的问题,请参考以下文章
超键(super key)、候选键(candidate key)和主键(primary key) 外键(foreign key)的区别