【问题标题】:One view from two tables with identical column names来自具有相同列名的两个表的一个视图
【发布时间】:2017-10-19 13:29:08
【问题描述】:

我们有两个表需要合并成一个单一的视图。通常我会单独选择列来避免这个问题,但是在这种情况下,这两个表是 800 列的组合。

唯一相同的列是标识符列。不幸的是,这些无法更改,因为它们被第 3 方工具用于同步表

Table A
GUID
Name
Address
...

Table B
GUID
Cell
Fax
Home2
...

是很好的例子,假设每个表有 400 奇数列。

显然是传统的

SELECT a.*, b.* from table_a a, table_b a where a.guid = b.guid

惨败。有没有什么简单的方法可以创建视图而不必列出 799 个单独的列名?我在想也许是一个一次性的功能来创建视图,但到目前为止我正在碰壁。

【问题讨论】:

  • 您是否考虑过生成包含列别名的 SQL 脚本?
  • 为什么不能列出列?为什么你在两个表中有 400 列???听起来好像有什么大错特错。还有 800 列的视图?你打算怎么办?无论如何,您都不想在视图中使用 select *。当表格发生变化时,它会导致各种问题。而且您真的应该开始使用 ANSI-92 样式的连接,它们已经存在超过 25 年了。
  • 您可以动态创建查询,因此您不必自己进行输入。但肖恩是对的。
  • 右键单击 Management Studio 中的表,将表脚本作为 SELECT TO.. 在两个表上。 Ctrl+A -> Ctrl+C 将此脚本写入新文件。利润!
  • 我觉得 OP 的痛苦。听起来像是我为客户工作的医疗系统。每个字段都是“GenericText01”或“GenericInt02”。数百个。然后他们将它们隐藏在表示层上。他们每天都会发出一份新的地图文件。这真是我见过的最糟糕的数据库。

标签: sql sql-server


【解决方案1】:

您可以使用动态 sql 作为解决方案。

CREATE TABLE test1 (id INT, col1 NVARCHAR(50), col2 NVARCHAR(50))
GO
CREATE TABLE test2(id INT, col1 NVARCHAR(50), col2 NVARCHAR(50))
GO


DECLARE @sql NVARCHAR(max) = ''

; WITH cte AS  (
SELECT 
CASE WHEN TABLE_NAME = 'test1' THEN TABLE_NAME + '.' + COLUMN_NAME + ' AS ' + + COLUMN_NAME +  't1' ELSE TABLE_NAME + '.' + COLUMN_NAME + ' AS ' + + COLUMN_NAME +  't2' END  AS a, 1 AS ID
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('test1', 'test2')
) 

SELECT @sql = 
'CREATE VIEW myview as 
select ' + (
SELECT
STUFF(
(
SELECT ', '+ [A]
FROM cte
WHERE ID = results.ID
FOR XML PATH(''), TYPE
).value('(./text())[1]','VARCHAR(MAX)')
,1,2,''
) AS NameValues
FROM cte results
GROUP BY ID
) + ' from test1 join test2 on test1.id = test2.id' 

PRINT @sql
--EXEC (@sql)

结果是

CREATE VIEW myview
AS
    SELECT  test1.id AS idt1 ,
            test1.col1 AS col1t1 ,
            test1.col2 AS col2t1 ,
            test2.id AS idt2 ,
            test2.col1 AS col1t2 ,
            test2.col2 AS col2t2
    FROM    test1
            JOIN test2 ON test1.id = test2.id

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多