我有一个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 ....
但问题是,当它选择orgid
,org
,lang
和eli
时,它只会获得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
答案 0 :(得分:1)
在这种情况下,我建议只编写一个可以执行此选择的视图,并且可以在需要此类功能的任何地方重复使用它。如果您需要修改它,更新视图很简单(尽管您必须小心,没有任何基本逻辑可以对该视图起作用)。
为了轻松完成此操作,您实际上可以将表格从SSMS单击拖动到查询窗口中。只需将相关表格下的Columns文件夹单击并拖动到查询窗口中,它就会将所有列复制到其中。这样,您可以手动执行选择,而无需键入所有内容。
答案 1 :(得分:0)
您可以使用Isnull(SQL服务器)。它允许您提供一个值来使用您选择的incase列为null。
select isnull(t.org, s.org) as org
如果T有一个值,它会给你,否则它会给你一个来自S
的值编辑:
SPFiredrake指出我专注于错误的部分。你可以做的另一件事(如果所有你担心的是一个巨大的SQL脚本)是从T中选择*然后只选择S中可能需要的几列,然后处理任何语言中的比较逻辑数据