当有外键和主键时获得唯一项目?重复项(具有唯一弱键)?

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。您没有要求其他组。 我知道,但我有你在,所以我想问问。谢谢您的帮助。希望我现在能解决这个问题。

以上是关于当有外键和主键时获得唯一项目?重复项(具有唯一弱键)?的主要内容,如果未能解决你的问题,请参考以下文章

请问SQL server 中的主键和外键的作用

SQLServer主键和唯一约束的区别

超键(super key)、候选键(candidate key)和主键(primary key) 外键(foreign key)的区别

mysql 主键索引和唯一索引的区别

数据库中的键码,候选键码,主键码,公共键码,外键码有啥区别?求高人,谢谢了

主键、外键和索引的区别?