2017-07-26 70 views
-1

所以我有一個觀點,我想爲每個用戶返回一行,並從其他表中引入(聯合)一些字段。一切正常,除了最後一部分。TSQL - 如果有任何行存在,則返回單個值?

其中一個表具有與用戶關聯的多行,並且如果任何查找行都有值,我希望視圖返回的行中的一個值爲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匹配。是的,那裏有很多步驟!

+0

當您查看MSDN中的EXISTS()函數,並試圖按照這裏的示例進行操作時,您嘗試了什麼,出現了什麼錯誤? –

+1

創建視圖時,不應使用USR。*。如果[USER]表的列中有任何更改,它將在未來給您帶來問題。 – DVT

+0

@DVT是的,我知道。實際的觀點不是 - 我只是這樣做,以減少線條。 :)不想垃圾郵件的問題與50列。 :) – Coyttl

回答

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 
+0

不幸的是,給出了相同的結果。不是你的錯 - 但我忘了提到這個鏈接。主要問題將更新爲缺失的信息。 – Coyttl

相關問題