Sql 将列值复制到表的另一部分

Sql 将列值复制到表的另一部分,sql,Sql,我有一个SELECT语句和一个使用两个表的join。我们有表Shell和表carner 它看起来像是这样的在S.id=T.id上,从shell的左外连接槽罐车T中选择S.*,T.*注意,油轮大约有183个字段。 所以我得到了以下数据 ====Shell table==== =========Tanker table columsn====================== orgid org eli lang orgid org Lang {Othe

我有一个
SELECT
语句和一个使用两个表的
join
。我们有表
Shell
和表
carner

它看起来像是这样的
在S.id=T.id
上,从shell的左外连接槽罐车T中选择S.*,T.*注意,
油轮
大约有183个字段。

所以我得到了以下数据

     ====Shell table==== =========Tanker table columsn======================   
    orgid  org eli lang orgid   org     Lang    {Other columns start}
    906875  s   1   1   NULL    NULL    NULL    NULL    NULL    NULL    NULL
    906876  s   2   2   NULL    NULL    NULL    NULL    NULL    NULL    NULL
    906877  b   2   1   NULL    NULL    NULL    NULL    NULL    NULL    NULL
    906878  s   1   1   NULL    NULL    NULL    NULL    NULL    NULL    NULL
    906879  b   2   1   NULL    NULL    NULL    NULL    NULL    NULL    NULL
现在我想选择orgid、org、lang和其他183个字段。所以现在我知道了
从….中选择T.
但问题是,当它选择
orgid
org
lang
eli
时,它只会得到空值。这是有意义的,因为我只选择了
T.*
,它是一个左连接,所以它们自然是空的

但是,出于我的目的,我需要它们是shell表中的值。我想从Shell中选择orgid、org、eli、lang,然后从Tanker中选择其余的。我知道我这样做的一个方法是

select s.orgid, s.org, s.eli, s.lang, t.column, t.column2, t.column3
但是回想一下
油轮T
几乎有200列。我不想在我的脚本上写200列

这就是问题所在

是否有任何方法可以将orgid、org、eli、lang的值(即实际的非空值)复制到空的列中?这样我就可以只做
选择T.*
并选择所有200列

所以,如果你真的感到困惑,我想要的最终结果是

    ====Shell table==== =========Tanker table columsn======================    
    orgid  org eli lang orgid   org     Eli Lang    {Other columns start}
    906875  s   1   1   906875  s        1  1       NULL    NULL
    906876  s   2   2   906876  s        2  2       NULL    NULL    NULL
    906877  b   2   1   906877  b        2  1       NULL    NULL
    906878  s   1   1   906878  s        1  1       NULL    NULL    NULL
    906879  b   2   1   906879  b        2  1       NULL    NULL    NULL
您可以使用Isnull(SQL server)。它允许您提供一个值,以便在您选择的列为空时使用

select isnull(t.org, s.org) as org
如果T有一个值,它给你这个值,否则它给你S中的值

编辑:

SPFiredrake指出我把注意力放错了地方。您可以做的另一件事(如果您所担心的只是一个庞大的SQL脚本)是从T中选择*然后从S中选择可能需要的几列,然后用任何语言处理数据的比较逻辑。

您可以使用Isnull(SQL server)。它允许您提供一个值,以便在您选择的列为空时使用

select isnull(t.org, s.org) as org
如果T有一个值,它给你这个值,否则它给你S中的值

编辑:


SPFiredrake指出我把注意力放错了地方。您可以做的另一件事(如果您所担心的只是一个庞大的SQL脚本)是从T中选择*然后从S中选择可能需要的几列,然后用任何语言处理数据的比较逻辑。

在这种情况下,我建议您只编写一个执行此选择的视图,您可以在需要此类功能的任何地方重用它。如果您需要修改它,只需更新视图(尽管您必须小心,因为您没有任何基本的逻辑来反对该视图)


为了方便地执行此操作,实际上可以单击并将表从SSMS拖到查询窗口中。只需单击并将相关表下的Columns文件夹拖动到查询窗口中,它就会将所有列复制到其中。这样,您就可以手动执行选择,而不必键入所有内容。

在这种情况下,我建议您只编写一个执行此选择的视图,您可以在需要此类功能的任何地方重用它。如果您需要修改它,只需更新视图(尽管您必须小心,因为您没有任何基本的逻辑来反对该视图)


为了方便地执行此操作,实际上可以单击并将表从SSMS拖到查询窗口中。只需单击并将相关表下的Columns文件夹拖动到查询窗口中,它就会将所有列复制到其中。这样,您就可以手动进行选择,而不必键入所有内容。

我认为唯一的方法是使用动态sql。您正在使用什么RDM?您尝试过什么?不幸的是,使用*进行列排除并不是一种简单的方法。我建议您创建一个视图来实现这一点,这样您就可以引用该视图,而不必担心在需要时重写这种类型的脚本。我认为唯一的方法是使用动态sql。您正在使用什么RDM?您尝试过什么?不幸的是,使用*进行列排除并不是一种简单的方法。我的建议是创建一个视图来实现这一点,这样你就可以引用视图,而不必担心在需要的时候重写这种类型的脚本。这不是他想要的。他想选择油轮的所有列,但只将其中三列替换为
Shell
列。诚然,这项技术将在那里使用,但他明确表示,他不想写这么大的脚本。噢!出于某种原因,把它读成行!他仍然需要这样做,虽然是的,我的意思是,如果我有10个左右的专栏,这还不错。但是十年前有人认为在一张表中放183列是一件了不起的事情。哦,的确如此。我刚刚使用insert语句将这4列与旧表一起插入到新表中。他工作得很有魅力,这不是他想要的。他想选择油轮的所有列,但只将其中三列替换为
Shell
列。诚然,这项技术将在那里使用,但他明确表示,他不想写这么大的脚本。噢!出于某种原因,把它读成行!他仍然需要这样做,虽然是的,我的意思是,如果我有10个左右的专栏,这还不错。但是十年前有人认为在一张表中放183列是一件了不起的事情。哦,的确如此。我刚刚使用insert语句将这4列与旧表一起插入到新表中。工作得很有魅力。