我在下面的表格中存储了哪些表格/字段需要具有满足资格的值。
基本上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
)
您首先需要将多行表customfield
转换为单行,以便您可以轻松地将其与Client
表进行比较。
您可以使用CTE
和PIVOT
编写您的查询,如下所示。
;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
注意:您也可以使用子查询,而不是使用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)
你可以使用EXCEPT
。例如:
IF EXISTS
(
SELECT *
FROM Client
WHERE ClientID = 100
EXCEPT
SELECT *
FROM Client
WHERE ClientID = 101
)
BEGIN;
SELECT 'not equal'
END;