【问题标题】:SQL joins with not exitsSQL 连接不存在
【发布时间】:2017-04-25 15:54:48
【问题描述】:
SocialStatus
╔═════════════════════════════════════════════════════════════════╗
║ SocialStatusId | SocialTypeId | ResidentId | Details | IsActive ║
╠═════════════════════════════════════════════════════════════════╣
║       16       |      5       |      2     | Sample  |     1    ║
║       17       |      6       |      4     | kgfhkhgf|     0    ║
║       18       |      8       |      2     | NULL    |     1    ║
║       19       |      8       |      6     | NULL    |     0    ║
║       21       |      5       |      8     | asdasd  |     1    ║
║       22       |      5       |      3     | adasd   |     0    ║
╚═════════════════════════════════════════════════════════════════╝

Resident
╔════════════╦═══════════╦════════════╦══════════╦════════════╦═════════╦══════════╦═══════════════╦═══════════════╦══════════╦══════════╗
║ ResidentId ║ FirstName ║ MiddleName ║ LastName ║ Birthdate  ║ Address ║ GenderId ║ ContactNumber ║ IsNonResident ║ IsActive ║ StreetId ║
╠════════════╬═══════════╬════════════╬══════════╬════════════╬═════════╬══════════╬═══════════════╬═══════════════╬══════════╬══════════╣
║          8 ║ Jonathan  ║ Santos     ║ Guinto   ║ 2016-11-17 ║ Sample  ║        1 ║   09107435739 ║             0 ║        1 ║ NULL     ║
╚════════════╩═══════════╩════════════╩══════════╩════════════╩═════════╩══════════╩═══════════════╩═══════════════╩══════════╩══════════╝

SocialType
╔══════════════╦════════════════════════╦═════════════╦══════════╗
║ SocialTypeId ║       SocialName       ║ Description ║ IsActive ║
╠══════════════╬════════════════════════╬═════════════╬══════════╣
║            1 ║ Sample                 ║ Sample0001  ║        0 ║
║            2 ║ Sample2                ║ Sample222   ║        0 ║
║            3 ║ Sample3                ║ Sample3123  ║        0 ║
║            4 ║ Sample4                ║ Sample4     ║        0 ║
║            5 ║ Person with disability ║ Happy       ║        1 ║
║            6 ║ Señior Citizen         ║ Sample      ║        1 ║
║            7 ║ Unemployed             ║ sample      ║        1 ║
║            8 ║ Indigence              ║ sample      ║        1 ║
║            9 ║ Rowllens               ║ asdasdasd   ║        0 ║
║           10 ║                        ║             ║        0 ║
╚══════════════╩════════════════════════╩═════════════╩══════════╝

从上到下是

  • 社交状态
  • 居民
  • 社交类型

我想要做的是加入 SocialType 和 SocialStatus 表,然后过滤居民是否有这个,即 Señior Citizen 然后将位列分配给 true 以说明更多信息,请参阅输出表

我的查询

SELECT 
    st.SocialTypeId,
    st.SocialName,
    CASE WHEN ss.SocialStatusId IS NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END AS IsAssign
FROM dbo.SocialType st
LEFT JOIN dbo.SocialStatus ss ON st.SocialTypeId = ss.SocialTypeId
WHERE ss.IsActive = 1 AND ss.ResidentId = 8

此查询仅返回 SocialType 表的单列 输出是

╔══════════════╦════════════════════════╦══════════╗
║ SocialTypeId ║       SocialName       ║ IsAssign ║
╠══════════════╬════════════════════════╬══════════╣
║            5 ║ Person with disability ║        1 ║
╚══════════════╩════════════════════════╩══════════╝

欲望输出是这样的

╔══════════════╦════════════════════════╦══════════╗
║ SocialTypeId ║       SocialName       ║ IsAssign ║
╠══════════════╬════════════════════════╬══════════╣
║            5 ║ Person with disability ║        1 ║
║            6 ║ Señior Citizen         ║        0 ║
║            7 ║ Unemployed             ║        0 ║
║            8 ║ Indigence              ║        0 ║
╚══════════════╩════════════════════════╩══════════╝

【问题讨论】:

  • 查询如何只返回单列?!!
  • 请给所有表命名,这很令人困惑,并发布您想要的输出而不是您的查询返回的内容。
  • @Suraz 我已经更新了问题,并且已经发布了所需的输出,请参阅最后一个表格输出谢谢

标签: sql sql-server database join inner-join


【解决方案1】:

根据你的Desire结果,尝试下一个:

select 
        distinct st.SocialTypeId, 
        SocialName, 
        CASE 
            WHEN ss.SocialStatusId IS NULL 
            THEN CAST(1 AS bit) 
            ELSE CAST(0 AS bit) 
            END AS IsAssign
from 
        SocialType st left outer join SocialStatus ss
on      
        st.SocialTypeId = ss.SocialTypeId
where 
        st.IsActive = 1

结果如下:-

注意:

关于column“IsAssign”,您的期望结果是1 for SocialTypeId equlas 5 altought ss.SocialStatusId 有数字! ,所以根据您使用的CASE 线索,结果将是0,是否有问题,请重新访问您的CASE 线索。


更新取决于以下评论-

用于过滤ss.residentId =8 在连接条件中使用它而不是在 Where 子句中。

如下:-

select 
        distinct st.SocialTypeId, 
        SocialName, 

        CASE 
            WHEN ss.SocialStatusId IS NOT NULL
            THEN CAST(1 AS bit) 
            ELSE CAST(0 AS bit) 
            END AS IsAssign
from 
        SocialType st left outer join SocialStatus ss
on      
        st.SocialTypeId = ss.SocialTypeId and
        ss.residentId =8
where 
        st.IsActive = 1

【讨论】:

猜你喜欢
  • 2016-05-05
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2019-03-15
相关资源
最近更新 更多