TSQL - 如果存在任何行,则返回单个值?

时间:2017-07-26 18:39:50

标签: sql-server tsql jointable

所以我有一个视图,我想为每个用户返回一行,其中一些字段从其他表中引入(加入)。一切都有效,除了最后一部分。

其中一个表有多个与用户关联的行,如果任何查找行都有值,我希望视图返回的行中的一个值为0/1。观点:

CREATE VIEW [VW_USER_LIST]
AS
    SELECT  USR.*, 
        UPL.FIRST_NAME, 
        UPL.LAST_NAME, 
        UPL.MIDDLE_INITIAL, 
        UPL.LDAP_DN, 
        UPL.RSS_TOKEN, 
        UPL.LAST_UPDATE_DATE,
        UPL.TIMEZONE, 
        UPL.CULTURE,
        (RTRIM(UPL.FIRST_NAME + ' ' + ISNULL(UPL.MIDDLE_INITIAL,'')) + ' ' + UPL.LAST_NAME) AS FULL_NAME,
        UPOM.ORGANIZATION_ID AS ORGANIZATION_ID,
        UPO.NAME AS ORGANIZATION_NAME,
        UPOM.ORGANIZATION_ROLE_ID AS ORGANIZATION_ROLE_ID,
        CASE WHEN ROL.ROLE_ID IS NULL THEN CONVERT(bit,0) ELSE CONVERT(bit,1) END AS ISINTERNAL
    FROM [USER] AS USR 
        INNER JOIN [USER_PROFILE] AS UPL ON USR.USER_ID = UPL.USER_ID
        LEFT JOIN [USER_ORGANIZATION_MEMBERSHIP] AS UPOM ON USR.USER_ID = UPOM.USER_ID
        LEFT JOIN [ORGANIZATION] AS UPO ON UPOM.ORGANIZATION_ID = UPO.ORGANIZATION_ID
        LEFT JOIN [USER_ROLE] AS URL ON USR.USER_ID = URL.USER_ID
        LEFT JOIN [ROLE] AS ROL ON URL.ROLE_ID = ROL.ROLE_ID AND ROL.IS_INTERNAL=1

我最接近使用的检查是在' FROM',' CASE'之前的最后一个。返回BIT值0或1.匹配JOIN是列表中的最后一个JOIN。

但是,如果用户在USER_ROLE中有两个条目中标记为IS_INTERNAL=1的条目,则视图将返回该用户的两个条目。

我理解为什么。

然而,显然我需要的是使用EXISTSDISTINCTANY或其他单一检查加入 - 但无法找到一个很好的例子如何解决这个问题 - 如果可能的话

为了澄清,USER_ROLE表可能有USER_ID的多个条目,与ROLE表交叉引用。因此,如果用户在USER_ROLE表中的任何条目具有匹配的ROLE_ID,并且ROLE表中的条目带有IS_INTERNAL = 1。是的,那里有很多步骤!

1 个答案:

答案 0 :(得分:0)

这样的东西?

CREATE VIEW [VW_USER_LIST]
AS
    SELECT  USR.*, 
        UPL.FIRST_NAME, 
        UPL.LAST_NAME, 
        UPL.MIDDLE_INITIAL, 
        UPL.LDAP_DN, 
        UPL.RSS_TOKEN, 
        UPL.LAST_UPDATE_DATE,
        UPL.TIMEZONE, 
        UPL.CULTURE,
        (RTRIM(UPL.FIRST_NAME + ' ' + ISNULL(UPL.MIDDLE_INITIAL,'')) + ' ' + UPL.LAST_NAME) AS FULL_NAME,
        UPOM.ORGANIZATION_ID AS ORGANIZATION_ID,
        UPO.NAME AS ORGANIZATION_NAME,
        UPOM.ORGANIZATION_ROLE_ID AS ORGANIZATION_ROLE_ID,
        ISINTERNAL = cast(case when exists (select 1
                                            from [role] rol
                                            where url.role_id = rol.rol_id
                                                and rol.is_internal = 1) then 1 
                               else 0 
                          end as bit)
    FROM [USER] AS USR 
        INNER JOIN [USER_PROFILE] AS UPL ON USR.USER_ID = UPL.USER_ID
        LEFT JOIN [USER_ORGANIZATION_MEMBERSHIP] AS UPOM ON USR.USER_ID = UPOM.USER_ID
        LEFT JOIN [ORGANIZATION] AS UPO ON UPOM.ORGANIZATION_ID = UPO.ORGANIZATION_ID
        LEFT JOIN [USER_ROLE] AS URL ON USR.USER_ID = URL.USER_ID