将字段连接回主表的自定义表

问题描述 投票:1回答:2

我在下面的表格中存储了哪些表格/字段需要具有满足资格的值。

基本上Client.Field1必须包含值1,Client.Field2必须包含值2,等等。

如果所有值都在Client表中匹配,有没有人知道我如何返回True;如果在Client表中值不匹配,有人知道False,并且它足够灵活,如果添加了额外的字段,它将被拾取吗?

CREATE TABLE [CustomField](
    [CustomFieldID] [smallint] IDENTITY(1,1) NOT NULL,
    [FieldTable] [nvarchar](100) NOT NULL,
    [FieldName] [nvarchar](100) NOT NULL,
    [EligibilityValue] [tinyint] NULL,
 CONSTRAINT [PK_CustomField] PRIMARY KEY CLUSTERED 
(
    [CustomFieldID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
INSERT [CustomField] ([CustomFieldID], [FieldTable], [FieldName], [EligibilityValue]) VALUES (119, N'Client', N'Field1', 1)
GO
INSERT [CustomField] ([CustomFieldID], [FieldTable], [FieldName], [EligibilityValue]) VALUES (120, N'Client', N'Field2', 2)
GO
INSERT [CustomField] ([CustomFieldID], [FieldTable], [FieldName], [EligibilityValue]) VALUES (130, N'Client', N'Field3', 1)
GO
INSERT [CustomField] ([CustomFieldID], [FieldTable], [FieldName], [EligibilityValue]) VALUES (141, N'Client', N'Field4', 2)
GO

CREATE TABLE Client
(
    ClientID int,
    Field1 int,
    Field2 int,
    Field3 int,
    Field4 int
)

--this would return True when the comparison is done
insert into Client
(
    ClientID,
    Field1,
    Field2,
    Field3,
    Field4
)
values
(
    100,
    1,
    2,
    1,
    2
)

--this would return False when the comparison is done
insert into Client
(
    ClientID,
    Field1,
    Field2,
    Field3,
    Field4
)
values
(
    101,
    1,
    2,
    2,
    2
)
sql sql-server
2个回答
1
投票

您首先需要将多行表customfield转换为单行,以便您可以轻松地将其与Client表进行比较。

您可以使用CTEPIVOT编写您的查询,如下所示。

;WITH cte 
     AS (SELECT [field1], 
                [field2], 
                [field3], 
                [field4] 
         FROM   (SELECT fieldtable, 
                        fieldname, 
                        eligibilityvalue 
                 FROM   customfield) AS SourceTable 
                PIVOT ( Max(eligibilityvalue) 
                      FOR fieldname IN ([Field1], 
                                        [Field2], 
                                        [Field3], 
                                        [Field4]) ) AS pivottable) 
SELECT c.*, 
       COALESCE(O.found, 'Not Found') AS Found 
FROM   client C 
       OUTER APPLY (SELECT 'Found' Found 
                    FROM   cte CT 
                    WHERE  CT.field1 = c.field1 
                           AND CT.field2 = c.field2 
                           AND CT.field3 = c.field3 
                           AND CT.field4 = c.field4) O 

产量

ClientID    Field1  Field2  Field3  Field4  Found
100          1       2       1        2     Found
101          1       2       2        2     Not Found

Online Demo

注意:您也可以使用子查询,而不是使用OUTER APPLY

编辑:

要使其动态化,您需要使用PIVOT编写动态查询,如下所示。

DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', ' + Quotename([FieldName]) 
         FROM   CustomField
         FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 

DECLARE @sqltext VARCHAR(MAX)

SELECT @sqltext = ISNULL(@sqltext,'')  + 'CT.' + C.[FieldName]  + ' = ' + 'C.' + C.[FieldName] + ' AND '  +  CHAR(10)
  FROM CustomField c
  --Append Ending Condition
SET @sqltext = @sqltext + ' 1=1'



DECLARE @query AS NVARCHAR(max) ='
;WITH CTE AS
(
    SELECT ' + @cols + '    

     FROM  
    (SELECT FieldTable, FieldName, EligibilityValue   
        FROM CustomField) AS SourceTable  
    PIVOT  
    (  
    max(EligibilityValue)  
    FOR FieldName IN (' + @cols + ')  
    ) AS PivotTable  

)
SELECT c.*, COALESCE(O.Found,''Not Found'') as Found FROM Client C
OUTER APPLY
(
    SELECT ''Found'' Found FROM CTE CT where ' +  @sqltext + '
) O'

EXEC (@query)

Online Demo for Dynamic Query


0
投票

你可以使用EXCEPT。例如:

IF EXISTS
(
SELECT *
FROM Client
WHERE ClientID = 100
EXCEPT
SELECT *
FROM Client
WHERE ClientID = 101
)
BEGIN;
    SELECT 'not equal'
END;
© www.soinside.com 2019 - 2024. All rights reserved.