【问题标题】:SQL Syntax: Create a single table with column names created from data stored over multiple tablesSQL 语法:使用从存储在多个表中的数据创建的列名创建单个表
【发布时间】:2017-10-28 01:37:33
【问题描述】:

我创建了下面的 SQL 脚本,该脚本创建了四个表并将数据插入到表中以演示我的问题(我希望这会有所帮助!)。

之所以出现这个问题,是因为最初这些数据存储在一个包含 400 列的表中,并且变得非常难以管理,因此我想找到一种更好的方法来存储参数:

use master
GO
create database sptest
go

use sptest
go

CREATE TABLE JobFiles (
            [Id]       int PRIMARY KEY IDENTITY(0,1),
   [JobName]       nvarchar(256)  DEFAULT '',
   [CreateDate]     DateTime NOT NULL DEFAULT GETDATE(),
   [ModifyDate]     DateTime NOT NULL DEFAULT GETDATE(),
   [CreatedByUser]     nvarchar(64)  DEFAULT '',
   [ModifiedByUser]    nvarchar(64)  DEFAULT '')
GO


CREATE TABLE jpChar (
  [jpId] int PRIMARY KEY IDENTITY(0,1),
  [JobId] int REFERENCES JobFiles(Id),
  [jpName] varchar(64),
  [jpValue] nvarchar(255))


CREATE TABLE jpInt (
  [jpId] int PRIMARY KEY IDENTITY(0,1),
  [JobId] int REFERENCES JobFiles(Id),
  [jpName] varchar(64),
  [jpValue] int)

CREATE TABLE jpText (
  [jpId] int PRIMARY KEY IDENTITY(0,1),
  [JobId] int REFERENCES JobFiles(Id),
  [jpName] varchar(64),
  [jpValue] Text)


use spTest
go

    INSERT INTO JobFiles(JobName) VALUES ('File0')
    INSERT INTO JobFiles(JobName) VALUES ('File1')
    INSERT INTO JobFiles(JobName) VALUES ('File2')

    INSERT INTO jpChar(JobId,jpName, jpValue) VALUES (0, 'User', 'Paul')
    INSERT INTO jpChar(JobId,jpName, jpValue) VALUES (0, 'Dept', 'IT')
    INSERT INTO jpInt (JobId,jpName, jpValue) VALUES (0, 'Hours', '40')
    INSERT INTO jpText (JobId,jpName, jpValue) VALUES (0, 'Notes', 'Some Text')


    INSERT INTO jpChar(JobId,jpName, jpValue) VALUES (1, 'User', 'Bob')
    INSERT INTO jpChar(JobId,jpName, jpValue) VALUES (1, 'Dept', 'Sales')
    INSERT INTO jpInt (JobId,jpName, jpValue) VALUES (1, 'Hours', '20')
    INSERT INTO jpText (JobId,jpName, jpValue) VALUES (1, 'Notes', 'Some more Text')


    INSERT INTO jpChar(JobId,jpName, jpValue) VALUES (2, 'User', 'Jane')
    INSERT INTO jpChar(JobId,jpName, jpValue) VALUES (2, 'Dept', 'Support')


SELECT  JobFiles.Id, JobFiles.JobName,   
   jpChar.jpName AS cName, jpChar.jpValue AS cValue,
   jpInt.jpName AS iName, jpInt.jpValue AS iValue,
   jpText.jpName AS txtName, jpText.jpValue AS txtValue
FROM         JobFiles INNER JOIN
                      jpChar ON JobFiles.Id = jpChar.JobId LEFT JOIN
                      jpInt ON JobFiles.Id = jpInt.JobId LEFT JOIN
                      jpText ON JobFiles.Id = jpText.JobId

每个表中有数百个参数(以上只是几个),它们都引用了 JobFiles 表中的一行。

当我运行上面的 SELECT 语句时,我得到了预期的以下结果:

id  JobName cName   cValue  iName   iValue  txtName txtValue
0   File0   User    Paul    Hours   40      Notes   Some Text
0   File0   Dept    IT      Hours   40      Notes   Some Text
1   File1   User    Bob     Hours   20      Notes   Some more Text
1   File1   Dept    Sales   Hours   20      Notes   Some more Text
2   File2   User    Jane    NULL    NULL    NULL    NULL
2   File2   Dept    Support NULL    NULL    NULL    NULL

我想要实现的是以不同方式排列数据以匹配原始 400 列表的外观:

将名为 cName、iName、txtName 的列的数据值返回到 Columns 中。 将名为 cValue、iValue、txtValue 的列的数据值返回到行数据中。

id  JobName User   Dept    Hours   Notes
0   File0   Paul   IT      40      Some Text
1   File1   Bob    Sales   20      Some more Text 
2   File2   Jane   Support NULL    NULL
.     .       .       .      .       .

我不确定我将如何去做这件事,如果有任何建议和帮助,我将不胜感激?我还有其他问题,我将单独发布。

先谢谢你了。

【问题讨论】:

    标签: sql sql-server database database-design


    【解决方案1】:

    我可能会将“部门”记录分解到他们自己的表中,并相应地更改您的查询。

    您遇到的问题是因为您当前的数据库结构中的“用户”/“鲍勃”和“部门”/“IT”之间没有区别

    【讨论】:

    • 嗨,我目前正在研究如何使 400 列的表更易于管理,因为我需要在不同服务器之间执行同步并使用 c# 代码对表执行分析并在 c# 代码中写出 400 列是非常痛苦和维修的噩梦!基本上,400 col 表太大了。它只包含旧 .ini 文件(平面文件)中参数的名称/值列表,并希望转换为数据库以与其他 sql 服务器共享?
    【解决方案2】:

    您似乎不是标准化您的设计(1NF、2NF、3NF),而是根据每列的数据类型创建了表格,因此使用您的脚本对表格进行了透视。

    您不能像拥有逻辑实体一样简单地加入,而必须将整个事物转回。 Here are some pivoting examples

    我希望你还有原版。我建议使用实体和关系来规范您的设计,而不是这种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多