あなたはこれを行うことができます:
SELECT *
FROM Othertable t1
INNER JOIN #temp321 t2 ON t1.Field1 = t2.field1
AND t1.Field2 = t2.field2
AND t1.Field3 = t2.field3;
更新:これは私ができることです:
JOIN
WHERE
句の代わりに動的に2つのテーブル:
DECLARE @DynamicJOINCondition AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
;WITH cte
AS
(
SELECT t1.COLUMN_NAME 'T1', t2.COLUMN_NAME 'T2'
FROM
(
SELECT
ordinal_position ,
column_name
FROM information_schema.columns
WHERE table_name LIKE '#temp321%'
) t1
INNER JOIN
(
SELECT
ordinal_position ,
column_name
FROM information_schema.columns
WHERE table_name = 'othertable'
) t2 ON t1.ORDINAL_POSITION = t2.ORDINAL_POSITION
)
SELECT @DynamicJOINCondition = STUFF((SELECT distinct ' AND ' +
' t1.' + T1 + ' = ' + 't2.' + T2
FROM cte
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 4,1,'');
-- Remove the first AND
SELECT @DynamicJOINCondition = RIGHT(@DynamicJOINCondition,
LEN(@DynamicJOINCondition) - 4);
SET @query = 'SELECT COUNT(*) ' +
' FROM #temp321 t1 INNER JOIN Othertable t2 ON ' +
@DynamicJOINCondition;
EXECUTE(@query);
これはどのように機能しますか?
最初にJOIN
、一時テーブルから列名のリストを取得し、他のテーブルから列名の他のリストを取得することにより、条件を動的に生成しました。それに注意してください。ORDINAL_POSITION
データベース内の各列のテーブルに格納されているメタデータである列を使用してinformation_schema.columns
、2つのテーブルの列名のリストを比較しました。たとえば、通常の位置1の列は、2番目のテーブルの通常の位置1の列名と結合されます。したがって、2番目のテーブルの他の列リストと同じ順序で列がリストされるように、一時テーブルの列の位置に注意する必要があります。
Update2:
WHERE
句を動的に生成します。
WHERE
を使用する代わりに動的に句を生成するJOIN
場合は、この場合、さらに作業が必要になります。そのようです:
DECLARE @DynamicWHERECondition AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
;WITH cte
AS
(
SELECT t1.COLUMN_NAME 'T1', t2.COLUMN_NAME 'T2'
FROM
(
SELECT
ordinal_position,
column_name
FROM information_schema.columns
WHERE table_name LIKE '#temp321%'
) t1
INNER JOIN
(
SELECT
ordinal_position,
column_name
FROM information_schema.columns
WHERE table_name = 'othertable'
) t2 ON t1.ORDINAL_POSITION = t2.ORDINAL_POSITION
), cte2
AS
(
SELECT t2, fieldvalue
FROM cte t1
INNER JOIN
(
SELECT FieldName, fieldvalue
FROM
(
SELECT field1, field2, field3, field4
FROM #temp321
) p
UNPIVOT
(
fieldvalue FOR FieldName IN (field1, field2, field3, field4)
) AS u
) t2 ON t1.T2 = t2.FieldName
)
SELECT @DynamicWHERECondition = STUFF((SELECT distinct ' AND ' +
T2 + ' = ' + '''' + fieldvalue + ''''
FROM cte2
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 4,1,'');
SELECT @DynamicWHERECondition = RIGHT(@DynamicWHERECondition, LEN(@DynamicWHERECondition) - 4);
SET @query = 'SELECT COUNT(*) ' +
' FROM Othertable t2 WHERE ' + @DynamicWHERECondition;
EXECUTE(@query);
これはどのように機能しますか?
一時テーブルには、動的に作成されたWHERE
句を形成するために使用される値を持つ1つの行しか含まれていないため、UNPIVOT
この1つの行を2つの列に編集しました:fieldname: field1, field2, ...
とfieldvalue: value1, value2, ...
。
後で、このピボットされていない列を、最初のクエリで使用した2つのテーブルと結合しました。
SELECT
ordinal_position,
column_name
FROM information_schema.columns
WHERE table_name LIKE '#temp321%';
と:
SELECT
ordinal_position,
column_name
FROM information_schema.columns
WHERE table_name = 'othertable';
結合条件は、2つのテーブルの列の順序位置によって、最初のケースの条件と同じになります。
一時テーブルの値WHERE
を動的に使用して、句を動的に生成します。UNPIVOT
しかし、前のアプローチには大きな問題があります。次のように、テーブルtempを動的にアンピボットする必要があります。
SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(column_name)
FROM information_schema.columns
WHERE table_name LIKE '#temp321%'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
SET @dynamicunpivotquery = ' SELECT FieldName, fieldvalue ' +
' FROM ' +
' ( SELECT * FROM #temp321 ' +
' ) p ' +
' UNPIVOT ' +
' ( ' +
' fieldvalue FOR FieldName IN (' + @cols + ' ) ' +
' ) AS u ';
ただし、クエリの後半で動的にピボットされていないテーブルを使用するには、一時テーブルを作成する必要があります。
DECLARE @unpivotedTable TABLE(FieldName varchar(50), fieldvalue VARCHAR(50));
INSERT INTO @unpivotedTable
exec(@dynamicunpivotquery);
あなたがそのようにそれを使うことができるように:
SELECT t2, fieldvalue
FROM cte t1
INNER JOIN @unpivotedTable t2 ON t1.T2 = t2.FieldName
動的unpivotで更新されたSQLは次のとおりです。
DECLARE @DynamicWHERECondition AS NVARCHAR(MAX);
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @dynamicunpivotquery AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
DECLARE @unpivotedTable TABLE(FieldName varchar(50), fieldvalue VARCHAR(50));
SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(column_name)
FROM information_schema.columns
WHERE table_name LIKE '#temp321%'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
SET @dynamicunpivotquery = ' SELECT FieldName, fieldvalue ' +
' FROM ' +
' ( SELECT * FROM #temp321 ' +
' ) p ' +
' UNPIVOT ' +
' ( ' +
' fieldvalue FOR FieldName IN (' + @cols + ' ) ' +
' ) AS u ';
INSERT INTO @unpivotedTable
exec(@dynamicunpivotquery);
;WITH cte
AS
(
SELECT t1.COLUMN_NAME 'T1', t2.COLUMN_NAME 'T2'
FROM
(
SELECT
ordinal_position,
column_name
FROM information_schema.columns
WHERE table_name LIKE '#temp321%'
) t1
INNER JOIN
(
SELECT
ordinal_position,
column_name
FROM information_schema.columns
WHERE table_name = 'othertable'
) t2 ON t1.ORDINAL_POSITION = t2.ORDINAL_POSITION
), cte2
AS
(
SELECT t2, fieldvalue
FROM cte t1
INNER JOIN @unpivotedTable t2 ON t1.T2 = t2.FieldName
)
SELECT @DynamicWHERECondition = STUFF((SELECT distinct ' AND ' +
T2 + ' = ' + '''' + fieldvalue + ''''
FROM cte2
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 4,1,'');
SELECT @DynamicWHERECondition = RIGHT(@DynamicWHERECondition,
LEN(@DynamicWHERECondition) - 4);
SET @query = 'SELECT COUNT(*) ' +
' FROM Othertable t2 WHERE ' + @DynamicWHERECondition;
EXECUTE(@query);