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

时间:2012-06-07 14:25:14

标签: sql

我有一个SELECT语句以及一个使用两个表的join。我们有表格Shell和表格Tanker

它看起来像这个select S.*, T.* from shell S left outer join tanker T on S.id = T.id请注意,Tanker有大约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个字段。所以现在我做 select T.* FROM .... 但问题是,当它选择orgidorglangeli时,它只会获得NULLS。这是有道理的,因为我只选择T.*及其左连接,所以这些将自然为空。

但是,出于我的目的,我需要它们是shell表中的值。也就是说,我想从壳牌中选择orgid,org,eli,lang,然后从Tanker中选择其余的。我知道我这样做的一种方法是以下

select s.orgid, s.org, s.eli, s.lang, t.column, t.column2, t.column3

但是召回 Tanker T有近200列。我不想在我的脚本上写200列。

所以这就是问题。

有没有什么方法可以将orgid,org,eli,lang(即实际非空值)的值“复制”到null为空的列?这样我就可以select 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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以使用Isnull(SQL服务器)。它允许您提供一个值来使用您选择的incase列为null。

select isnull(t.org, s.org) as org

如果T有一个值,它会给你,否则它会给你一个来自S

的值

编辑:

SPFiredrake指出我专注于错误的部分。你可以做的另一件事(如果所有你担心的是一个巨大的SQL脚本)是从T中选择*然后只选择S中可能需要的几列,然后处理任何语言中的比较逻辑数据