sql >> データベース >  >> RDS >> Sqlserver

結合されたテーブルのリストから一意の列名を選択します

    このスクリプトは、PK名が類似しているテーブルの動的SQLを生成します。

    クエリ:

    SET NOCOUNT ON
    
    IF OBJECT_ID (N'dbo.A') IS NOT NULL
       DROP TABLE dbo.A
    
    IF OBJECT_ID (N'dbo.B') IS NOT NULL
       DROP TABLE dbo.B
    
    IF OBJECT_ID (N'dbo.C') IS NOT NULL
       DROP TABLE dbo.C
    
    CREATE TABLE dbo.A (PK_field INT PRIMARY KEY, column1 INT, column2 INT)
    CREATE TABLE dbo.B (PK_field INT PRIMARY KEY, column3 INT, column4 INT)
    CREATE TABLE dbo.C (PK_field INT PRIMARY KEY, column5 INT, [column 6] INT)
    
    INSERT INTO dbo.A (PK_field, column1, column2)
    VALUES (1, 1, 2), (2, 1, 2) 
    
    INSERT INTO dbo.B (PK_field, column3, column4)
    VALUES (2, 3, 4) 
    
    INSERT INTO dbo.C (PK_field, column5, [column 6])
    VALUES (1, 5, 6), (3, 5, 6) 
    
    DECLARE @SQL NVARCHAR(MAX)
    
    ;WITH cte AS 
    (
        SELECT 
              column_name = '[' + c.name + ']'
            , table_name = '[' + s.name + '].[' + o.name + ']'
        FROM sys.columns c WITH (NOLOCK)
        JOIN sys.objects o WITH (NOLOCK) ON c.[object_id] = o.[object_id]
        JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id]
        WHERE o.name IN ('A', 'B', 'C')
            AND s.name = 'dbo'
            AND o.[type] = 'U'  
    ), unicol AS (
        SELECT TOP 1 column_name 
        FROM cte 
        GROUP BY cte.column_name
        HAVING COUNT(cte.column_name) > 1
    ), cols AS 
    (
        SELECT DISTINCT column_name 
        FROM cte    
    ), tbl AS 
    (
        SELECT DISTINCT table_name
        FROM cte
    ), rs AS 
    (
        SELECT 
              tbl.table_name
            , column_name = ISNULL(cte.column_name, cols.column_name + ' = NULL')
        FROM cols
        CROSS JOIN tbl
        LEFT JOIN cte ON cols.column_name = cte.column_name AND cte.table_name = tbl.table_name
    ), rs2 AS (
        SELECT uni = ' UNION ALL' + CHAR(13) + 'SELECT ' + STUFF((
            SELECT ', ' + rs.column_name
            FROM rs
            WHERE tbl.table_name = rs.table_name
            GROUP BY rs.column_name
            ORDER BY rs.column_name
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + 
            ' FROM ' + table_name
        FROM tbl
    ) 
    SELECT @SQL = 'SELECT 
    ' + STUFF((
        SELECT CHAR(13) + ', ' + ISNULL(unicol.column_name, cols.column_name + ' = MAX(' + cols.column_name + ')')
        FROM cols
        LEFT JOIN unicol ON cols.column_name = unicol.column_name
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ')
     + ' 
    FROM 
    (' + STUFF((
        SELECT CHAR(10) + uni
        FROM rs2
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 11, '') + CHAR(13) + 
        ') t 
    GROUP BY ' + (SELECT column_name FROM unicol)
    
    PRINT @SQL
    
    EXECUTE sys.sp_executesql @SQL
    

    出力:

    SELECT 
          [column 6] = MAX([column 6])
        , [column1] = MAX([column1])
        , [column2] = MAX([column2])
        , [column3] = MAX([column3])
        , [column4] = MAX([column4])
        , [column5] = MAX([column5])
        , [PK_field] 
    FROM (
        SELECT [column 6] = NULL, [column1], [column2], [column3] = NULL, [column4] = NULL, [column5] = NULL, [PK_field] FROM [dbo].[A]
         UNION ALL
        SELECT [column 6] = NULL, [column1] = NULL, [column2] = NULL, [column3], [column4], [column5] = NULL, [PK_field] FROM [dbo].[B]
         UNION ALL
        SELECT [column 6], [column1] = NULL, [column2] = NULL, [column3] = NULL, [column4] = NULL, [column5], [PK_field] FROM [dbo].[C]
    ) t 
    GROUP BY [PK_field]
    

    結果:

    column 6    column1     column2     column3     column4     column5     PK_field
    ----------- ----------- ----------- ----------- ----------- ----------- -----------
    6           1           2           NULL        NULL        5           1
    NULL        1           2           3           4           NULL        2
    6           NULL        NULL        NULL        NULL        5           3
    

    スクリプトの更新:

    DECLARE @SQL NVARCHAR(2000) -> NVARCHAR(MAX)
    

    DDLの出力:

    SELECT 
      [blaiseKey_code]
    , [bDEM_BOP_q1stParentBornNZ] = MAX([bDEM_BOP_q1stParentBornNZ])
    , [bDEM_BOP_q2ndParentBornNZ] = MAX([bDEM_BOP_q2ndParentBornNZ])
    , [bDEM_BOP_qHowManyParentBornNZ] = MAX([bDEM_BOP_qHowManyParentBornNZ])
    , [bDEM_BOP_qHowManyRaised] = MAX([bDEM_BOP_qHowManyRaised])
    , [bDEM_WOR_q2Jobs1HrsIntro] = MAX([bDEM_WOR_q2Jobs1HrsIntro])
    , [bDEM_WOR_q2Jobs2HrsIntro] = MAX([bDEM_WOR_q2Jobs2HrsIntro])
    , [bDEM_WOR_q2JobsNoHrsIntro] = MAX([bDEM_WOR_q2JobsNoHrsIntro])
    , [bDEM_WOR_qEmployArrangement] = MAX([bDEM_WOR_qEmployArrangement])
    , [bDEM_WOR_qFeelAboutJob] = MAX([bDEM_WOR_qFeelAboutJob])
    , [bDEM_WOR_qJobsNum] = MAX([bDEM_WOR_qJobsNum])
    , [bDEM_WOR_qJobsNumNR] = MAX([bDEM_WOR_qJobsNumNR])
    , [bDEM_WOR_qMainTasks] = MAX([bDEM_WOR_qMainTasks])
    , [bDEM_WOR_qMainTasksNR] = MAX([bDEM_WOR_qMainTasksNR])
    , [bDEM_WOR_qOccupation] = MAX([bDEM_WOR_qOccupation])
    , [bDEM_WOR_qOccupationNR] = MAX([bDEM_WOR_qOccupationNR])
    , [bDEM_WOR_qPaidWorkIntro] = MAX([bDEM_WOR_qPaidWorkIntro])
    , [bDEM_WOR_qPermEmployee] = MAX([bDEM_WOR_qPermEmployee])
    , [bDEM_WOR_tabDEM_T2_fTotMins] = MAX([bDEM_WOR_tabDEM_T2_fTotMins])
    , [fCountryName] = MAX([fCountryName])
    , [q3MthsStudy] = MAX([q3MthsStudy])
    , [qAge] = MAX([qAge])
    , [qAge15OrOver] = MAX([qAge15OrOver])
    , [qAgeNR] = MAX([qAgeNR])
    , [qAgeRange] = MAX([qAgeRange])
    , [qArriveNZMth] = MAX([qArriveNZMth])
    , [qArriveNZYr] = MAX([qArriveNZYr])
    , [qArriveNZYrNR] = MAX([qArriveNZYrNR])
    , [qAwayFromWork] = MAX([qAwayFromWork])
    , [qBornInNZ] = MAX([qBornInNZ])
    , [qCouldStartLastWk] = MAX([qCouldStartLastWk])
    , [qCountryOfBirth] = MAX([qCountryOfBirth])
    , [qDidPaidWork] = MAX([qDidPaidWork])
    , [qDOB] = MAX([qDOB])
    , [qDOBNR] = MAX([qDOBNR])
    , [qFamilyBusWork] = MAX([qFamilyBusWork])
    , [qHasJobToStart] = MAX([qHasJobToStart])
    , [qHighestQual] = MAX([qHighestQual])
    , [qHighestQualOth] = MAX([qHighestQualOth])
    , [qHighestQualOthNR] = MAX([qHighestQualOthNR])
    , [qHighestQualYr] = MAX([qHighestQualYr])
    , [qHighestQualYrNR] = MAX([qHighestQualYrNR])
    , [qIncTotalAmt] = MAX([qIncTotalAmt])
    , [qJobSearchA] = MAX([qJobSearchA])
    , [qJobSearchB] = MAX([qJobSearchB])
    , [qJobSearchC] = MAX([qJobSearchC])
    , [qJobSearchD] = MAX([qJobSearchD])
    , [qJobSearchE] = MAX([qJobSearchE])
    , [qJobSearchF] = MAX([qJobSearchF])
    , [qJobSearchG] = MAX([qJobSearchG])
    , [qJobSearchH] = MAX([qJobSearchH])
    , [qJobSearchI] = MAX([qJobSearchI])
    , [qJobSearchOth] = MAX([qJobSearchOth])
    , [qJobSearchOthNR] = MAX([qJobSearchOthNR])
    , [qLookedForWork] = MAX([qLookedForWork])
    , [qMaoriDescent] = MAX([qMaoriDescent])
    , [qNotEligible] = MAX([qNotEligible])
    , [qPostSchQual] = MAX([qPostSchQual])
    , [qSchQual] = MAX([qSchQual])
    , [qSchQualOth] = MAX([qSchQualOth])
    , [qSchQualOthNR] = MAX([qSchQualOthNR])
    , [qSchQualYr] = MAX([qSchQualYr])
    , [qSchQualYrNR] = MAX([qSchQualYrNR])
    , [qSex] = MAX([qSex])
    , [qThingsWorthwhileScale] = MAX([qThingsWorthwhileScale])
    , [qWorkIntro] = MAX([qWorkIntro]) 
    FROM 
    (
    SELECT [bDEM_BOP_q1stParentBornNZ], [bDEM_BOP_q2ndParentBornNZ], [bDEM_BOP_qHowManyParentBornNZ], [bDEM_BOP_qHowManyRaised], [bDEM_WOR_q2Jobs1HrsIntro], [bDEM_WOR_q2Jobs2HrsIntro], [bDEM_WOR_q2JobsNoHrsIntro], [bDEM_WOR_qEmployArrangement], [bDEM_WOR_qFeelAboutJob], [bDEM_WOR_qJobsNum], [bDEM_WOR_qJobsNumNR], [bDEM_WOR_qMainTasks], [bDEM_WOR_qMainTasksNR], [bDEM_WOR_qOccupation], [bDEM_WOR_qOccupationNR], [bDEM_WOR_qPaidWorkIntro], [bDEM_WOR_qPermEmployee], [bDEM_WOR_tabDEM_T2_fTotMins], [blaiseKey_code], [fCountryName], [q3MthsStudy], [qAge], [qAge15OrOver], [qAgeNR], [qAgeRange], [qArriveNZMth], [qArriveNZYr], [qArriveNZYrNR], [qAwayFromWork], [qBornInNZ], [qCouldStartLastWk], [qCountryOfBirth], [qDidPaidWork], [qDOB], [qDOBNR], [qFamilyBusWork], [qHasJobToStart], [qHighestQual], [qHighestQualOth], [qHighestQualOthNR], [qHighestQualYr], [qHighestQualYrNR], [qIncTotalAmt], [qJobSearchA], [qJobSearchB], [qJobSearchC], [qJobSearchD], [qJobSearchE], [qJobSearchF], [qJobSearchG], [qJobSearchH], [qJobSearchI], [qJobSearchOth], [qJobSearchOthNR], [qLookedForWork], [qMaoriDescent], [qNotEligible], [qPostSchQual], [qSchQual], [qSchQualOth], [qSchQualOthNR], [qSchQualYr], [qSchQualYrNR], [qSex], [qThingsWorthwhileScale] = NULL, [qWorkIntro] FROM [dbo].[G_bDEM]
     UNION ALL
    SELECT [bDEM_BOP_q1stParentBornNZ] = NULL, [bDEM_BOP_q2ndParentBornNZ] = NULL, [bDEM_BOP_qHowManyParentBornNZ] = NULL, [bDEM_BOP_qHowManyRaised] = NULL, [bDEM_WOR_q2Jobs1HrsIntro] = NULL, [bDEM_WOR_q2Jobs2HrsIntro] = NULL, [bDEM_WOR_q2JobsNoHrsIntro] = NULL, [bDEM_WOR_qEmployArrangement] = NULL, [bDEM_WOR_qFeelAboutJob] = NULL, [bDEM_WOR_qJobsNum] = NULL, [bDEM_WOR_qJobsNumNR] = NULL, [bDEM_WOR_qMainTasks] = NULL, [bDEM_WOR_qMainTasksNR] = NULL, [bDEM_WOR_qOccupation] = NULL, [bDEM_WOR_qOccupationNR] = NULL, [bDEM_WOR_qPaidWorkIntro] = NULL, [bDEM_WOR_qPermEmployee] = NULL, [bDEM_WOR_tabDEM_T2_fTotMins] = NULL, [blaiseKey_code], [fCountryName] = NULL, [q3MthsStudy] = NULL, [qAge] = NULL, [qAge15OrOver] = NULL, [qAgeNR] = NULL, [qAgeRange] = NULL, [qArriveNZMth] = NULL, [qArriveNZYr] = NULL, [qArriveNZYrNR] = NULL, [qAwayFromWork] = NULL, [qBornInNZ] = NULL, [qCouldStartLastWk] = NULL, [qCountryOfBirth] = NULL, [qDidPaidWork] = NULL, [qDOB] = NULL, [qDOBNR] = NULL, [qFamilyBusWork] = NULL, [qHasJobToStart] = NULL, [qHighestQual] = NULL, [qHighestQualOth] = NULL, [qHighestQualOthNR] = NULL, [qHighestQualYr] = NULL, [qHighestQualYrNR] = NULL, [qIncTotalAmt] = NULL, [qJobSearchA] = NULL, [qJobSearchB] = NULL, [qJobSearchC] = NULL, [qJobSearchD] = NULL, [qJobSearchE] = NULL, [qJobSearchF] = NULL, [qJobSearchG] = NULL, [qJobSearchH] = NULL, [qJobSearchI] = NULL, [qJobSearchOth] = NULL, [qJobSearchOthNR] = NULL, [qLookedForWork] = NULL, [qMaoriDescent] = NULL, [qNotEligible] = NULL, [qPostSchQual] = NULL, [qSchQual] = NULL, [qSchQualOth] = NULL, [qSchQualOthNR] = NULL, [qSchQualYr] = NULL, [qSchQualYrNR] = NULL, [qSex] = NULL, [qThingsWorthwhileScale], [qWorkIntro] = NULL FROM [dbo].[G_bLWW]
    ) t 
    GROUP BY [blaiseKey_code]
    


    1. xml切り捨て値からのOracle抽出

    2. インターバルタイプをHH:MMフォーマットにフォーマットする方法は?

    3. テーブル作成時のMySQL構文エラー

    4. 削除後にSQLServerで自動インクリメントをリセットする