所以我有一个观点,我想为每个用户返回一行,并从其他表中引入(联合)一些字段。一切正常,除了最后一部分。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
的条目,则该视图将为该用户返回两个条目。
我明白为什么。
但是,显然我需要的是使用EXISTS
,DISTINCT
,ANY
,或者在加入另一个奇异检查 - 但无法找到如何实现自己的目标一个很好的例子 - 如果它甚至有可能。
并且为了澄清,USER_ROLE
表可以具有USER_ID
的多个条目,与ROLE
表相互引用。因此,如果用户在USER_ROLE
表中具有匹配的ROLE_ID
中的任何条目,并且ROLE
表中的条目与IS_INTERNAL = 1
匹配。是的,那里有很多步骤!
当您查看MSDN中的EXISTS()函数,并试图按照这里的示例进行操作时,您尝试了什么,出现了什么错误? –
创建视图时,不应使用USR。*。如果[USER]表的列中有任何更改,它将在未来给您带来问题。 – DVT
@DVT是的,我知道。实际的观点不是 - 我只是这样做,以减少线条。 :)不想垃圾邮件的问题与50列。 :) – Coyttl