1

私は次のような一時テーブルを持っています:#temp321

select * from #temp321

のような戻り値です

Field1|Field2|Field3|....|FieldN|
--------------------------------
Value1|Value2|Value3|....|ValueN|

この#temp321テーブルは、別のクエリセットから自動生成されるため、#temp321テーブルの列の数を変えることができます(1〜25)。ただし、それらは常に1行になります。次に、これらの値を使用してwhereステートメントを作成する必要があります。
例:
where Field1='Value1' and Field2='Value2' and Field3='Value3'.....FieldN='ValueN'..(depends on number of column available into the #temp321 table)
どうやってやるのか。前もって感謝します

4

1 に答える 1

5

あなたはこれを行うことができます:

SELECT *
FROM Othertable t1
INNER JOIN #temp321 t2 ON  t1.Field1 = t2.field1 
     AND t1.Field2 = t2.field2 
     AND t1.Field3 = t2.field3;

更新:これは私ができることです:

JOINWHERE句の代わりに動的に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);
于 2012-11-19T11:20:52.360 に答える