【发布时间】:2017-06-25 20:27:55
【问题描述】:
我有一些表(例如[Table1]、[Table2]、[Table3] 等),每个表都以[ID] 作为主键,RecTime 作为DATETIME。
我也有一个表[Files],它在varbinary(max) 列中保存文件,并引用具有其名称和ID 的其他表。
[Table2]、[Table3] 和其他具有不同的结构,但共享 [ID] 和 [RecTime] 列与 [Table1] 中完全相同
以下是可视化数据的快速示例。
DECLARE @Table1 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Table2 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Table3 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Files as table (
[ID] [bigint]
, [tblName] nvarchar(255) NULL
, [tblID] bigint NULL
, [BinaryData] varbinary(max)
/* and some other columns */
)
INSERT INTO @Table1 (
[ID]
, [RecTime]
)
SELECT '1', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '2', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '3', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '4', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '5', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
INSERT INTO @Table2 (
[ID]
, [RecTime]
)
SELECT '11', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '12', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '13', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '14', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '15', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
INSERT INTO @Table3 (
[ID]
, [RecTime]
)
SELECT '21', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '22', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '23', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '24', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
UNION ALL SELECT '25', DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
INSERT INTO @Files (
[ID]
, [tblName]
, [tblID]
, [BinaryData]
)
SELECT '1', 'Table1', '1', 0x010203040506
UNION ALL SELECT '2', 'Table1', '2', 0x010203040506
UNION ALL SELECT '3', 'Table1', '2', 0x010203040506
UNION ALL SELECT '4', 'Table1', '3', 0x010203040506
UNION ALL SELECT '5', 'Table1', '4', 0x010203040506
UNION ALL SELECT '6', 'Table1', '5', 0x010203040506
UNION ALL SELECT '7', 'Table1', '5', 0x010203040506
UNION ALL SELECT '8', 'Table2', '11', 0x010203040506
UNION ALL SELECT '9', 'Table2', '11', 0x010203040506
UNION ALL SELECT '10', 'Table2', '12', 0x010203040506
UNION ALL SELECT '11', 'Table2', '13', 0x010203040506
UNION ALL SELECT '12', 'Table2', '14', 0x010203040506
UNION ALL SELECT '13', 'Table2', '12', 0x010203040506
UNION ALL SELECT '14', 'Table2', '15', 0x010203040506
UNION ALL SELECT '15', 'Table3', '21', 0x010203040506
UNION ALL SELECT '16', 'Table3', '22', 0x010203040506
UNION ALL SELECT '17', 'Table3', '24', 0x010203040506
UNION ALL SELECT '18', 'Table3', '23', 0x010203040506
UNION ALL SELECT '19', 'Table3', '25', 0x010203040506
UNION ALL SELECT '20', 'Table3', '25', 0x010203040506
UNION ALL SELECT '21', 'Table3', '21', 0x010203040506
SELECT * FROM @Table1
SELECT * FROM @Table2
SELECT * FROM @Table3
SELECT * FROM @Files
如何将[Files] 表连接到其他表,其中Name 和ID 派生自“[Files]”表中的值?
我需要来自[Files] 表的[BinaryData] 和来自[Files] 表中相应表引用的[RecTime]。
真正的问题是[Table1]、[Table2] 和[Table3] 并不是唯一的表,它们被引用[Files] 表。可以创建新表,其二进制数据必须存储在[Files]表中。
所以我正在寻找一种动态“加入”它们的方法。
附:我不是这个系统的创建者,也不能对其进行任何结构上的改变,只是试图解决这个问题。
任何帮助将不胜感激。
【问题讨论】:
-
select tblName,BinaryData,RecTime from files f join table1 t on f.tblID = t.id where tblName = 'Table1' union all select tblName,BinaryData,RecTime from files f join table2 t on f .tblID = t.id where tblName = 'Table2' union all select tblName,BinaryData,RecTime from files f join table3 t on f.tblID = t.id where tblName = 'Table3' 您需要在示例中替换为表名
-
你试过动态查询并在最后执行了吗?
-
我认为您的问题是模式设计之一。显然,实体之间存在未(正确)表示的关系。解决方案是否必须使用所描述的模式/数据,还是使用替代数据库设计的解决方案可以达到相同的目的?
-
您的示例基于 3 个表,实际上可以有多少个表(即超过 100 个)?
-
您好,请查看此链接stackoverflow.com/questions/8851801/…@Harun Prasad 回答
标签: sql sql-server sql-server-2012 dynamic-sql cursors