sql - 如何通过连接具有一对多关系的 3 个表来查询唯一或不同的值

标签 sql sql-server google-cloud-spanner

我想为每个类别获取不同的国家/地区值。

举个例子。

一个类别有许多公司,而这些公司又在其下有许多属于不同县的子公司。假设汽车类别及其公司是丰田和本田。我们都知道,丰田和本田本身就是全局性公司,在全局设有分支机构。

我想使用字符串 aggr 显示以“|”分隔的这些国家/地区的唯一值。

我该怎么做?

示例数据:

Category table

------------------
ID   |   Name    |  
------------------
1    |  Cars     |    
2    |  Game     |
------------------
Company Table

---------------------------------------
ID   |  CompanyName    | Category
---------------------------------------
1    |  Toyota         |   Cars
2    |  Honda          |   Cars
3    |  Sony           |   Game
4    |  EA             |   Game
--------------------------------------
Branches table

--------------------------------------------------------------------
BranchID      |    BranchName     |    Country      | ParentCompany|
--------------------------------------------------------------------
1             | Toyota_America    |    USA          | Toyota       |
2             | Toyota_Japan      |    JP           | Toyota       |
3             | Honda_India_Mumbai|    IN           | Honda        |
4             | Honda_India_Delhi |    IN           | Honda        |
5             | Sony_Japan_Tokyo  |    JP           | Sony         |
6             | Sony_Japan_Hokaido|    JP           | Sony         |
7             | Sony_Spain        |    ES           | Sony         |
--------------------------------------------------------------------

对于上面的示例,我希望输出为:

---------------------------------------------
Category   |    Company       |   Contries  |
---------------------------------------------
Car        |  Toyota|Honda    |  USA | JP | IN     
Game       |   Sony |EA       |    JP | ES  

正如您在 Sony 示例中所看到的,虽然 Japan 出现了两次,但只显示了一次。

我试过将 DISTINCT 与 joins 和 string_aggr 函数一起使用,但它似乎不起作用

我的查询:

SELECT DISTINCT ca.Category, co.Company, string_agg(br.Country, '|') as Countries 
FROM Category ca
LEFT JOIN Company co ON co.Category = ca.Name
LEFT JOIN Branches br ON br.ParentCompany = ca.CompanyName
Group By
ca.Category, co.Company

现在我知道使用 ID 和诸如此类的东西链接它们是最佳做法,但我只是这样做了,这样会更容易理解。

我做错了什么?

最佳答案

你缺少 group by(),因为你正在使用聚合函数 string_agg()

SELECT ca.Category, string_agg(co.Company, '|'), string_agg(br.Country, '|') as Countries 
FROM Category ca
LEFT JOIN Company co ON co.Category = ca.Name
LEFT JOIN Branches br ON br.ParentCompany = ca.CompanyName
GROUP BY ca.Category

关于sql - 如何通过连接具有一对多关系的 3 个表来查询唯一或不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57902527/

相关文章:

sql-server - Azure SQL 数据仓库表中的分区数据

sql-server - ORDER BY DATE 首先显示 NULL,然后显示最近的日期

google-cloud-platform - Google Cloud Spanner 和 Cloud SQL 之间有什么区别?

MySQL创建表并在行为空时返回特定值

sql - 合并多个表

java - 获取 SQLServerException makeFromDriverError 消息 'could not prepare statement' 和 'The connection is closed'

python - 如何获得 session 来执行交易?

google-cloud-platform - 在 Spanner 中拥有大量分片会产生成本吗?

sql - 如何在带有 IN 子句的 WHERE 中使用 CASE 语句?

python - pyodbc 插入 sql