SQL 查找具有多个引用的行

Posted

技术标签:

【中文标题】SQL 查找具有多个引用的行【英文标题】:SQL find rows with multiple references 【发布时间】:2013-02-04 11:13:04 【问题描述】:

对于我们的在线订购平台,我们有一个商店送货到的街道数据库。 基于我们 POS 系统的导出。

在现实世界中,只有一家商店可以送货到任何确切的街道地址。 在我们的数据库中,情况并非如此,其中街道名称会出现在多个商店中。

表格是这样的 - 简化:

街道

street_id
street_name
street_from
street_to
store_id

当前在表中的一些行示例:

1, "very nice street", 1, 999, 6
2, "very nice street", 1, 999, 10
3, "random street", 1, 53, 10
4, "random street", 2, 64, 10
5, "unique street", 1, 999, 10
6, "unique street", 1, 999, 6

关于如何获取所有行的任何想法,其中相同的街道名称被引用到两个或多个商店?在上面的示例中,我希望查询返回“非常漂亮的街道”和“独特的街道”。我不想要“随机街道”,因为它只引用了第 10 号商店。

因此下面的 SQL 将返回“随机街道”

SELECT street_name, COUNT(*)
FROM streets
GROUP BY street_name
HAVING COUNT(*) > 1;

【问题讨论】:

【参考方案1】:

您可以通过GROUP BYHAVING 实现此目的:

SELECT * from streets group by street_name having count(*) > 1

这是一个工作示例:SQLFiddle。下面是一篇您可能会感兴趣的短文:The HAVING and GROUP BY SQL clauses。


根据您的编辑,返回所需结果的查询将是:

SELECT street_name, store_id, count(*) 
FROM streets 
GROUP BY street_name
HAVING COUNT(DISTINCT store_id) > 1

注意DISTINCT store_id 的使用。如果有另一个random street 引用存储#10,它不会因为DISTINCT 而通过。我在updated SQLFiddle 中包含了一个示例。

【讨论】:

嗨,我已经稍微改变了问题 - 您的解决方案也是我的第一个想法。我最初的问题有点过于简单了。 不,将它们分组以仍然返回“随机街道”,因为有 2 行具有该街道名称,但我们不想要该数据,因为它是同一家商店。 谢谢,成功了。不,我有一些事情要处理;)我需要考虑到街道名称实际上可能出现在不同的城市,但我在GROUP BY 中添加了“zip_code”字段并解决了它。【参考方案2】:

试试这个,

SELECT street_name, COUNT(*)
FROM streets
GROUP BY street_name
HAVING COUNT(*) > 1;

【讨论】:

嗨,我已经稍微改变了问题 - 您的解决方案也是我的第一个想法。我最初的问题有点过于简单了。

以上是关于SQL 查找具有多个引用的行的主要内容,如果未能解决你的问题,请参考以下文章

使用java在sql中查找具有相同数据的具有相同值的行?

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

SQL - 在列中查找具有特定值组合的行

查找具有已定义结束的连续相同值的行组 (SQL Redshift)

续集如何查找具有多个 where 子句和时间戳的行 > NOW()

无论如何,为了提高 SQL 查询的性能,以按标签匹配计数查找具有顺序的行