sql – 从已连接表的列表中选择唯一列名

前端之家收集整理的这篇文章主要介绍了sql – 从已连接表的列表中选择唯一列名前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个表列表,可以通过相同的PK列连接在一起.由于这个表列表可能因项目而异,我想创建一个足够动态的查询来从这些表中提取所有唯一列.
  1. For example,I have three tables below:
  2. Table A (PK field,column1,column 2)
  3. Table B (PK field,column3,column 4)
  4. Table C (PK field,column5,column 5)

这三个表连接在“PK字段”列上,我希望查询输出类似于:

  1. PK field column1 column2 column3 column4 column5
  2. ..data.. ..data.. ..data.. ..data.. ..data.. ..data..

最后,此查询将成为sql函数或SP的一部分,因此用户可以定义表的列表,并在开头的PK字段,然后执行它将返回我的预期输出与数据集.

我想在下面使用这个查询,但结果不是我喜欢的:

  1. SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''

有关如何设计此SP或功能的任何建议,将不胜感激.

提前致谢.

两个示例表的DDL:

  1. CREATE TABLE [dbo].[G_bDEM](
  2. [blaiseKey_code] [nvarchar](255) NULL,[qSex] [int] NULL,[qDOB] [datetime] NULL,[qDOBNR] [int] NULL,[qAge] [int] NULL,[qAgeNR] [int] NULL,[qAgeRange] [int] NULL,[qAge15OrOver] [int] NULL,[qNotEligible] [nvarchar](1) NULL,[qBornInNZ] [int] NULL,[qCountryOfBirth] [nvarchar](2) NULL,[qArriveNZYr] [int] NULL,[qArriveNZYrNR] [int] NULL,[qArriveNZMth] [int] NULL,[bDEM_BOP_qHowManyRaised] [int] NULL,[bDEM_BOP_q1stParentBornNZ] [int] NULL,[bDEM_BOP_q2ndParentBornNZ] [int] NULL,[bDEM_BOP_qHowManyParentBornNZ] [int] NULL,[qMaoriDescent] [int] NULL,[qSchQual] [int] NULL,[qSchQualOth] [nvarchar](200) NULL,[qSchQualOthNR] [int] NULL,[qSchQualYr] [int] NULL,[qSchQualYrNR] [int] NULL,[qPostSchQual] [int] NULL,[q3MthsStudy] [int] NULL,[qHighestQual] [int] NULL,[qHighestQualOth] [nvarchar](200) NULL,[qHighestQualOthNR] [int] NULL,[qHighestQualYr] [int] NULL,[qHighestQualYrNR] [int] NULL,[qWorkIntro] [nvarchar](1) NULL,[qDidPaidWork] [int] NULL,[qAwayFromWork] [int] NULL,[qFamilyBusWork] [int] NULL,[bDEM_WOR_qPaidWorkIntro] [nvarchar](1) NULL,[bDEM_WOR_qJobsNum] [int] NULL,[bDEM_WOR_qJobsNumNR] [int] NULL,[bDEM_WOR_tabDEM_T2_fTotMins] [int] NULL,[bDEM_WOR_q2JobsNoHrsIntro] [nvarchar](1) NULL,[bDEM_WOR_q2Jobs2HrsIntro] [nvarchar](1) NULL,[bDEM_WOR_q2Jobs1HrsIntro] [nvarchar](1) NULL,[bDEM_WOR_qOccupation] [nvarchar](200) NULL,[bDEM_WOR_qOccupationNR] [int] NULL,[bDEM_WOR_qMainTasks] [nvarchar](200) NULL,[bDEM_WOR_qMainTasksNR] [int] NULL,[bDEM_WOR_qFeelAboutJob] [int] NULL,[bDEM_WOR_qEmployArrangement] [int] NULL,[bDEM_WOR_qPermEmployee] [int] NULL,[qHasJobToStart] [int] NULL,[qLookedForWork] [int] NULL,[qJobSearchA] [int] NULL,[qJobSearchB] [int] NULL,[qJobSearchC] [int] NULL,[qJobSearchD] [int] NULL,[qJobSearchE] [int] NULL,[qJobSearchF] [int] NULL,[qJobSearchG] [int] NULL,[qJobSearchH] [int] NULL,[qJobSearchI] [int] NULL,[qJobSearchOth] [nvarchar](200) NULL,[qJobSearchOthNR] [int] NULL,[qCouldStartLastWk] [int] NULL,[qIncTotalAmt] [int] NULL,[fCountryName] [nvarchar](60) NULL
  3. ) ON [PRIMARY]
  4.  
  5. GO
  6.  
  7. CREATE TABLE [dbo].[G_bLWW](
  8. [blaiseKey_code] [nvarchar](255) NULL,[qThingsWorthwhileScale] [int] NULL
  9. ) ON [PRIMARY]

解决方法

此脚本为具有类似PK名称的任何表生成动态sql.

查询

  1. SET NOCOUNT ON
  2.  
  3. IF OBJECT_ID (N'dbo.A') IS NOT NULL
  4. DROP TABLE dbo.A
  5.  
  6. IF OBJECT_ID (N'dbo.B') IS NOT NULL
  7. DROP TABLE dbo.B
  8.  
  9. IF OBJECT_ID (N'dbo.C') IS NOT NULL
  10. DROP TABLE dbo.C
  11.  
  12. CREATE TABLE dbo.A (PK_field INT PRIMARY KEY,column1 INT,column2 INT)
  13. CREATE TABLE dbo.B (PK_field INT PRIMARY KEY,column3 INT,column4 INT)
  14. CREATE TABLE dbo.C (PK_field INT PRIMARY KEY,column5 INT,[column 6] INT)
  15.  
  16. INSERT INTO dbo.A (PK_field,column2)
  17. VALUES (1,1,2),(2,2)
  18.  
  19. INSERT INTO dbo.B (PK_field,column4)
  20. VALUES (2,3,4)
  21.  
  22. INSERT INTO dbo.C (PK_field,[column 6])
  23. VALUES (1,5,6),(3,6)
  24.  
  25. DECLARE @sql NVARCHAR(MAX)
  26.  
  27. ;WITH cte AS
  28. (
  29. SELECT
  30. column_name = '[' + c.name + ']',table_name = '[' + s.name + '].[' + o.name + ']'
  31. FROM sys.columns c WITH (NOLOCK)
  32. JOIN sys.objects o WITH (NOLOCK) ON c.[object_id] = o.[object_id]
  33. JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id]
  34. WHERE o.name IN ('A','B','C')
  35. AND s.name = 'dbo'
  36. AND o.[type] = 'U'
  37. ),unicol AS (
  38. SELECT TOP 1 column_name
  39. FROM cte
  40. GROUP BY cte.column_name
  41. HAVING COUNT(cte.column_name) > 1
  42. ),cols AS
  43. (
  44. SELECT DISTINCT column_name
  45. FROM cte
  46. ),tbl AS
  47. (
  48. SELECT DISTINCT table_name
  49. FROM cte
  50. ),rs AS
  51. (
  52. SELECT
  53. tbl.table_name,column_name = ISNULL(cte.column_name,cols.column_name + ' = NULL')
  54. FROM cols
  55. CROSS JOIN tbl
  56. LEFT JOIN cte ON cols.column_name = cte.column_name AND cte.table_name = tbl.table_name
  57. ),rs2 AS (
  58. SELECT uni = ' UNION ALL' + CHAR(13) + 'SELECT ' + STUFF((
  59. SELECT ',' + rs.column_name
  60. FROM rs
  61. WHERE tbl.table_name = rs.table_name
  62. GROUP BY rs.column_name
  63. ORDER BY rs.column_name
  64. FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),2,'') +
  65. ' FROM ' + table_name
  66. FROM tbl
  67. )
  68. SELECT @sql = 'SELECT
  69. ' + STUFF((
  70. SELECT CHAR(13) + ',' + ISNULL(unicol.column_name,cols.column_name + ' = MAX(' + cols.column_name + ')')
  71. FROM cols
  72. LEFT JOIN unicol ON cols.column_name = unicol.column_name
  73. FOR XML PATH(''),' ')
  74. + '
  75. FROM
  76. (' + STUFF((
  77. SELECT CHAR(10) + uni
  78. FROM rs2
  79. FOR XML PATH(''),11,'') + CHAR(13) +
  80. ') t
  81. GROUP BY ' + (SELECT column_name FROM unicol)
  82.  
  83. PRINT @sql
  84.  
  85. EXECUTE sys.sp_executesql @sql

输出

  1. SELECT
  2. [column 6] = MAX([column 6]),[column1] = MAX([column1]),[column2] = MAX([column2]),[column3] = MAX([column3]),[column4] = MAX([column4]),[column5] = MAX([column5]),[PK_field]
  3. FROM (
  4. SELECT [column 6] = NULL,[column1],[column2],[column3] = NULL,[column4] = NULL,[column5] = NULL,[PK_field] FROM [dbo].[A]
  5. UNION ALL
  6. SELECT [column 6] = NULL,[column1] = NULL,[column2] = NULL,[column3],[column4],[PK_field] FROM [dbo].[B]
  7. UNION ALL
  8. SELECT [column 6],[column5],[PK_field] FROM [dbo].[C]
  9. ) t
  10. GROUP BY [PK_field]

结果:

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

脚本更新:

  1. DECLARE @sql NVARCHAR(2000) -> NVARCHAR(MAX)

DDL的输出

  1. SELECT
  2. [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])
  3. FROM
  4. (
  5. 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]
  6. UNION ALL
  7. 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,[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]
  8. ) t
  9. GROUP BY [blaiseKey_code]

猜你在找的MsSQL相关文章