0

为有点令人困惑的标题道歉,我一直在努力寻找我的问题的答案,部分原因是很难在标题行中简洁地描述它或想出一个好的搜索字符串。Anyhoooo,这是我面临的问题:

问题的简短版本是:如何在 Oracle 理解的有效 SQL 中编写以下(无效但可以理解的 SQL):

select B.REPLACER as COL, A.* except A.COL from A join B on a.COL = B.COL;

这是长版(如果你已经知道我想从阅读短版中得到什么,你不需要阅读这个 :P ):

我的(简化的)任务是提供对表数据进行处理并将其作为子查询提供的服务。该表有很多列(几十个或更多),我坚持使用“select *”而不是一一明确列出所有列,因为没有我可以在表中添加或删除新列知道,尽管我的下游系统会知道并相应地进行调整。

比如说,这个表(我们从现在开始称它为表 A)有一个名为“COL”的列,我们需要将该 COL 中的值替换为两个 COL 值匹配的表 B 的 REPLACER 列中的值。

我该怎么做呢?我无法重命名该列,因为下游系统需要“COL”;我不能没有“expect A.COL”部分,因为这会导致 sql 模棱两可。

感谢您的帮助,全能的 StackOverflow

射线

4

4 回答 4

2

您可以使用table.*table.fieldName

没有可用的语法table.* (except field X)

这意味着您只能通过明确列出所有字段来获得您想要的东西......

select
  A.field1,
  A.field2,
  B.field3,
  A.field4,
  etc
from
  A join B on a.COL = B.COL;

这意味着您可能需要重新建模您的数据,以确保您不会不断获得新字段。 OR写动态sql。查询数据库以找出列名,使用代码编写如上所述的查询,然后运行该动态生成的查询。

于 2012-06-28T08:52:52.817 回答
0

如前所述,您不能在常规 sql 中指定不选择哪一列。您可以为此编写一个过程,但这会非常复杂,因为您需要返回一个变量表类型。可能是带有 refcursor 魔法的东西。

我能想到的最接近的是加入使用。这将为您提供第一个字段中的列 col 一次,其余为 a 和 b 中的所有列。所以基本上不是你想要的。:)

select *
from   a
join   b using (col)
于 2012-06-28T09:20:57.743 回答
0

Try this: (not tested)

select Case B.COL
       when null then A.COL
       else B.REPLACER
       end as COLAB, A.*
from A left join B on A.COL = B.COL;

This should get the B.REPLACER when exists B.COL = A.COL, you can add more column in the select (like sample col1, col2) or use A.* (change COL into COLAB to make it distinguish with A.COL in A.*) .

于 2012-06-28T08:43:57.060 回答
0

让我们从首要原则开始。 select * from ....是一个等待发生的错误,在生产代码中没有位置。当然,每个人都使用它,因为它需要更少的打字,但这并不是一个好的做法。

除此之外,ANSI SQL 标准不支持 select * except col1 from ....语法。我知道很多人希望它会,但事实并非如此。

有几种方法可以避免过度打字。一种是通过从数据字典中选择,使用像 USER_TAB_COLUMNS 这样的视图之一来生成查询。如果您需要大量这样的查询,则值得编写 PL?SQL 块来执行此操作。

更简单的 hack 是使用 SQL*Plusdescribe列出表 A 的结构;将其剪切'n'粘贴到支持正则表达式的 IDE 中并编辑列以提供查询的投影。

这两个选项可能会让您觉得很费力,但坦率地说,任何一种解决方法(尤其是第二种方法)都会比询问 StackOverflow 花费更少的精力。下次你会知道的更好。

于 2012-06-28T09:30:42.993 回答