对于有点令人困惑的标题道歉,我一直在努力寻找我的问题的答案,部分原因是很难在标题行中简明地描述它或为它提出一个好的搜索字符串。 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”的列,我们需要用表B中REPLACER列中的值替换该COL中的值,其中两个COL值匹配。
我该怎么做?我无法重命名该列,因为下游系统需要“COL”;我不能没有“期待A.COL”部分,因为这会导致sql不明确。
感谢你的帮助,全能的StackOverflow
雷
答案 0 :(得分:1)
您可以使用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。询问数据库以找出列名,使用代码编写如上所述的查询,然后运行该动态生成的查询。
答案 1 :(得分:0)
试试这个:(未经测试)
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;
当存在B.COL = A.COL时,应该得到B.REPACER,你可以在选择中添加更多列(如样本col1,col2)或使用A. *(将COL更改为COLAB以使其区别于A.COL in A. *)。
答案 2 :(得分:0)
我能想到的最接近的是加入使用。这将为您提供第一个字段中的列col,其余为a和b中的所有列。所以基本上不是你想要的。 :)
select *
from a
join b using (col)
答案 3 :(得分:0)
让我们从第一原则开始。 select * from ....
是一个等待发生的错误,在生产代码中没有位置。当然每个人都使用它,因为它需要更少的打字,但这并不是一个好的做法。
除此之外,ANSI SQL标准不支持select * except col1 from ....
语法。我知道很多人都希望它会,但事实并非如此。
有两种方法可以避免过度打字。一种是通过使用USER_TAB_COLUMNS之类的视图之一从数据字典中进行选择来生成查询。如果您需要这样的大量查询,那么编写PL?SQL块是值得的。
更简单的方法是使用SQL * Plus describe
列出表A的结构; cut'n'paste它加入IDE,它支持正则表达式并编辑列以提供查询的投影。
这两个选项都可能会让你感到疲惫不堪,但坦率地说,无论是解决方法(尤其是第二个),都要比使用StackOverflow更省力。下次你会更清楚。