1

我有一个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,时langeli它只获得 NULLS。这是有道理的,因为我只选择T.*并且它是一个左连接,所以这些自然会为空。

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

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

但 RECALLTanker T近 200 列。我不想在我的脚本上写 200 列。

所以这就是问题所在。

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

2 回答 2

1

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

为了轻松地做到这一点,您实际上可以将一个表从 SSMS 中单击并拖动到查询窗口中。只需单击并将相关表下的 Columns 文件夹拖动到查询窗口中,它就会将所有列复制到其中。这样您就可以手动进行选择,而无需输入所有内容。

于 2012-06-07T14:36:25.777 回答
0

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

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

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

编辑:

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

于 2012-06-07T14:27:58.880 回答