具有多个外连接的 SQL 查询

标签 sql sql-server database oracle

我有三个表,关系为 GradParent (Country) > Parent (State) > Child (People)。我正在尝试实现查询以获取有关以下场景的不同信息并按国家/地区名称排序。
1. 所有人及其所在州和国家的数据。
2. 如果州没有人,则州和国家数据。
3. 如果没有国家和/或人民,那么只有国家数据。

表: enter image description here

SQL:

SELECT DISTINCT P1.ID as COUNTRY_ID, P1.NAME AS COUNTRY_NAME, P2.ID AS STATE_ID, 
P2.Name AS STATE_NAME , I1.ID AS PEOPLE_ID, I1.NAME AS PEOPLE_NAME 
FROM dbo.Country P1
    INNER JOIN dbo.State P2
        ON P2.Country_ID = P1.ID
        INNER JOIN dbo.People I1
            ON I1.Country_ID = P1.ID

    <!-- WHERE P1.Name like 'USA%'--- optional-->
    ORDER BY P1.NAME

最佳答案

使用LEFT OUTER 联接。即使没有匹配的子记录,它们也会将信息保留在父表中。

此外,根据您的数据模型,您应该不需要 DISTINCT 关键字。无缘无故地把它扔进去是一种不好的做法。

最后,PEOPLE 的加入条件需要受 STATE_ID 限制。

SELECT p1.id AS country_id,
       p1.name AS country_name,
       p2.id AS state_id,
       p2.name AS state_name,
       i1.id AS people_id,
       i1.name AS people_name
FROM   dbo.country p1
       LEFT JOIN dbo.state p2 ON p2.country_id = p1.id
       LEFT JOIN dbo.people i1 ON i1.country_id = p1.id AND i1.state_id = p2.id
-- WHERE P1.Name like 'USA%'--- optional--
ORDER BY p1.name, p2.name, i1.name

关于具有多个外连接的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39027922/

相关文章:

sql - 如何从oracle表中的多个分区中选择数据

php - 如何在 SQL (MySQL) 中合并两个表?

mysql - 使用命令行加载.sql文件

sql-server - 为什么 sp_rename 不适用于 CHECK 约束?

sql - 对 3 个随机行进行采样,然后按另一个属性的字母顺序对它们进行排序

mysql - 需要 MySQL 查询来提供更具可读性的结果

mysql - 我需要从连接的表中获取所有记录,其中至少有一个有条件的情况

sql-server - T-SQL - 使用非最优计划 - WHERE 子句应短路

mysql - 如何将这个场景组织到 MySQL 数据库中的表中?

database - 如何将用户密码安全地存储在 Cloudant 数据库中?