2017-09-11 36 views
1

我在爲此創建查詢時被卡住了。下面是表格。使用連接檢查多行

CREATE TABLE [dbo].[Mst_Conflict_Roles] 
(
    [CRLm_ID] [dbo].[ITS_BID] IDENTITY(1,1) NOT NULL, 
    [CRLm_Roles] [varchar](10) NOT NULL, 
    [CRLm_Description] [varchar](200) NULL, 
    [CRLm_Added_By] [dbo].[ITS_UserID] NOT NULL, 
    [CRLm_Added_Dt] [dbo].[ITS_Datetime] NOT NULL, 
    [CRLm_Last_Updated_By] [dbo].[ITS_UserID] NULL, 
    [CRLm_Last_Updated_Dt] [dbo].[ITS_Datetime] NULL, 
    [CRLm_data_del] [dbo].[ITS_TID] NOT NULL, 

    CONSTRAINT [PK_Mst_Conflict_Roles] 
     PRIMARY KEY CLUSTERED ([CRLm_ID] ASC) 
) ON [PRIMARY] 

INSERT INTO [Mst_Conflict_Roles] 
VALUES ('2,113', 'Scheduler - Auditor', 1, GETDATE(), 1, GETDATE(), 0), 
     ('110,113','AE - Scheduler',1,GETDATE(),1,GETDATE(),0), 
     ('2,121','Auditor - Vendor CAP User',1,GETDATE(),1,GETDATE(),0), 
     ('8,9','AM - AC',1,GETDATE(),1,GETDATE(),0) 



declare @userRole as table(userID int, userRole int) 
Insert into @userRole values (1, 2),(1, 113),(1, 8),(1, 9),(1, 50),(2, 110),(2, 50),(3, 2),(3, 121) 

select * from @userRole 

邏輯:如果用戶角色(UserRole的)匹配衝突表的角色(CRLm_Roles),然後記錄必須出現在輸出表。

輸出

UserID CRLm_ID CRLm_description 
1   1  2,113 
1   4  8,9 
3   3  2,121 

誰能告訴我我該怎麼處理這個?

+1

閱讀[?是存儲在數據庫中列分隔列表真的那麼壞(HTTP:// stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that-bad),你會看到很多原因,爲什麼這個問題的答案是**絕對是!** –

+0

@ZoharPeled:是的,但我們可以拆分逗號分隔值s到不同的行,然後使用連接進行匹配。這就是我面臨的問題,就好像用戶具有兩個不同行中的角色。 –

回答

2

下面的查詢返回所需的輸出:

WITH tmp (CRLm_ID, CRLm_Roles, Role_ID, Data) 
     AS (SELECT CRLm_ID , 
        CRLm_Roles , 
        CONVERT(NVARCHAR, LEFT(CRLm_Roles, 
              CHARINDEX(',', CRLm_Roles + ',') 
              - 1)) , 
        STUFF(CRLm_Roles, 1, CHARINDEX(',', CRLm_Roles + ','), 
          '') 
      FROM  [dbo].[Mst_Conflict_Roles] 
      UNION ALL 
      SELECT CRLm_ID , 
        CRLm_Roles , 
        CONVERT(NVARCHAR, LEFT(Data, 
              CHARINDEX(',', Data + ',') - 1)) , 
        STUFF(Data, 1, CHARINDEX(',', Data + ','), '') 
      FROM  tmp 
      WHERE Data > '' 
     ) 
SELECT UserID, CRLm_ID, CRLm_Roles AS CRLm_description 
FROM (SELECT CRLm_ID , 
        CRLm_Roles , 
        Role_ID , 
        userRole.* , 
        R = ROW_NUMBER() OVER (PARTITION BY userID, CRLm_ID ORDER BY userID) 
      FROM  tmp 
        JOIN userRole ON tmp.Role_ID = userRole.userRole 
     ) x 
WHERE R = 2 
OPTION (maxrecursion 0); 

輸出:

enter image description here

+0

是的,它按預期工作! –