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列与旧表一起插入到新表中。工作得很有魅力。