我的问题是基于:Finding table with two column names如果有兴趣,请阅读上述内容,因为它涵盖了很多地面,我不会在这里重复。
对于给出的答案,我评论如下:
注意,你可以用=和OR子句替换IN,但是将其推广到like可能不起作用,因为like每个项可能得到超过1个计数:例如
SELECT OWNER, TABLE_NAME, count(DISTINCT COLUMN_NAME) as ourCount
FROM all_tab_cols WHERE ( (column_name LIKE '%ID%') OR (COLUMN_NAME LIKE '%NUM%') )
GROUP BY OWNER, TABLE_NAME
HAVING COUNT(DISTINCT column_name) >= 2
ORDER BY OWNER, TABLE_NAME ;
这段代码编译并运行。但是,它不能保证表中既有名称包含ID的列,也有名称包含NUM的列,因为可能有两个或更多个名称类似ID的列。
有没有一种方法可以将上面的链接中给出的答案推广到类似的命令。目标:查找包含两个列名的表,一个像ID(或某个字符串),另一个像NUM(或其他某个字符串)。
此外,在几个答案进来之后,作为“额外的学分”,我重新做了Ahmed的答案,以便在Toad中使用变量,所以我也为Toad添加了一个标签。
6条答案
按热度按时间ejk8hzay1#
您可以按以下方式使用条件聚合:
请参见demo。
如果你想选择包含两个列名的表,one like ID和 one like NUM,你可以在having子句中用=1替换〉=1。
wwwo4jvm2#
如果我理解正确的话,您希望返回包含两个(或更多)列的表,这些列的名称包含
ID
和NUM
(sub)字符串。我的
all_tab_cols
CTE * 模仿了 * 数据字典视图,只是为了说明问题。EMP
表包含3个具有ID
(sub)字符串的列,但它应计为1(而不是3);此外,由于该表不包含名称中包含NUM
(sub)字符串的任何列,因此EMP
表不应该是结果集的一部分DEP
表包含一个ID
和一个NUM
列,因此应返回该表因此:
TEMP
CTE计算ID
和NUM
列的数量(重复项被忽略)。最终查询期望表包含这两列。样本数据:
查询从这里开始:
lb3vh1jj3#
你可以在一个子查询上执行一个
UNION ALL
,然后执行一个GroupBy
和一个Count
,通过将你的查询分成不同的结果集来确定你想要的表,一个基于ID
,另一个基于NUM
:8oomwypt4#
使函数易于重用:
5jvtdoz25#
这基本上是对Littlefoot的回答的“编辑”,我相信这会使事情变得更好。我给予应有的信任,但我被要求将其作为一个单独的回答,所以我这样做了。
piah890a6#
这是Ahmed使用条件聚合的答案的变体。我只是更新了它以使用变量。这在Toad中有效。它可能不适用于其他Oracle系统。
我认为p3consulting也给出了一个很好的答案,但下面的代码更短,更容易阅读(在我看来)。
有关我如何在Toad中添加变量的信息,请参阅Alan的回答:How do I declare and use variables in PL/SQL like I do in T-SQL?此外,要使用脚本变量,请在Toad中使用“作为脚本运行”,否则,将输入变量,这对我来说不是很可取。