SQL连接不退出

时间:2016-12-10 06:21:55

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

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 ║
╚══════════════╩════════════════════════╩═════════════╩══════════╝

从顶部到按钮是

  • SocialStatus
  • 驻地
  • SocialType

我想要做的是加入SocialType和SocialStatus表,然后过滤,如果Resident有这个SeñiorCitizen然后有点列分配给 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 ║
╚══════════════╩════════════════════════╩══════════╝

1 个答案:

答案 0 :(得分:1)

根据您的欲望结果,尝试下一个:

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

结果将如下: -

enter image description here

注意:

关于column" IsAssign",您对1 equlas SocialTypeId的渴望结果是5 altought ss.SocialStatusId有数字! ,根据您使用的0 cluse,结果将是CASE,是否有错误,请重新审视您的CASE线索。

更新取决于以下评论 -

For Filtering ss.residentId =8在Join条件而不是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