- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在工作中遇到了一个查询,但无法弄清楚它究竟是如何工作的。查询的作用是查找今天作为其 parent 的某个人的所有 parent 。
现在这里的诀窍是每个父子关系都有一个有效的持续时间。
以此数据集为引用:
GrandParent is parent of Father from 01-01-2012 to 02-02-2015
Father is parent of Child from 01-01-2012 to 02-02-2011
Child is just the lowest level person
NewFather is parent of Child from 01-01-2012 to 02-02-2014
现在 Child 今天有效的 parent 名单应该只包含 NewFather
为了获取列表,之前我们使用了这个 SQL:
SELECT connect_by_root per_id2 AS per_id2,
per_id1,
LEVEL AS per_level,
n.entity_name
FROM ci_per_per pp,
ci_per_name N
WHERE N.per_id = per_id1
AND start_dt <= SYSDATE
AND ( end_dt IS NULL
OR end_dt >= SYSDATE )
START WITH per_id2 = :personID
CONNECT BY NOCYCLE PRIOR per_id1 = per_id2;
其中 personID
是绑定(bind)变量
此查询无效,因为 where 子句的行为是先获取所有记录,然后检查非连接条件(检查开始日期和结束日期)。这导致它给出的 parent 列表为 NewFather, GrandParent
,这是完全错误的!
因此,查询更改为以下内容:
SELECT connect_by_root per_id2 AS per_id2,
per_id1,
LEVEL AS per_level,
n.entity_name
FROM ci_per_per pp,
ci_per_name N
WHERE N.per_id = per_id1
AND start_dt <= SYSDATE
AND ( end_dt IS NULL
OR end_dt >= SYSDATE )
START WITH per_id2 = (SELECT per_id
FROM ci_acct_per
WHERE per_id = :personID
AND pp.start_dt <= SYSDATE
AND ( pp.end_dt IS NULL
OR pp.end_dt >= SYSDATE ))
CONNECT BY NOCYCLE PRIOR per_id1 = per_id2;
现在我不明白的是:
how can a where condition in the start with clause affect the behavior of the query in such a manner?
我不喜欢这个查询的另一件事是它使用了一个完全不相关的表,名为 ci_acct_per
,其中只有 per_id
列用于 中的每个人>ci_per_per
.
Can we do better? Is a cleaner approach available for the fixing the original query?
更新
此查询仅适用于在层次结构中更高级别的旅行,而不适用于我们正在寻找 child 的情况。但是,此查询从不寻找 child ,也不应该这样做。
最佳答案
我不确定我是否理解正确,但为什么不:
SELECT connect_by_root per_id2 AS per_id2,
pp.per_id1,
LEVEL AS per_level,
n.entity_name
FROM (select *
from ci_per_per
where start_dt <= SYSDATE
AND ( end_dt IS NULL
OR end_dt >= SYSDATE )) pp join
ci_per_name N on N.per_id = pp.per_id1
START WITH per_id2 = 1
CONNECT BY NOCYCLE PRIOR pp.per_id1 = pp.per_id2;
更新感谢@user1395 example :
很难解释奇怪的查询是如何工作的,因为它不......
真正发生的是 START WITH
子句使用 per_id2,它是“父”列,所以如果有多个(一个与 sysdate 无关)你仍然需要 < strong>不是开始。
换句话说,它不是从“ child ”开始的,而是从“ child ”的父亲——“父亲”和“新父亲”开始的。
因此,要么使用@user1395 建议在 connect by
子句中使用日期逻辑以在父亲不相关时停止,并使用 start with
子句来制作只有相关的父亲可用,或者首先删除所有不相关的父亲(如我之前的建议)或“从”“ child ”而不是它的父亲开始:
select * from (
SELECT connect_by_root per_id1 AS per_id2,
per_id1,
LEVEL AS per_level,
n.entity_name
FROM ci_per_per pp,
ci_per_name N
WHERE N.per_id = per_id1
START WITH per_id1 = 1
CONNECT BY NOCYCLE PRIOR per_id1 = per_id2 AND start_dt <= SYSDATE
AND ( end_dt IS NULL
OR end_dt >= SYSDATE ))
where per_id1 <> per_id2;
关于database - 具有 where 子句行为的分层查询 "START WITH",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14869681/
在 Django 中如何处理分层 URL?有什么最佳做法吗?例如。如果我有一个像 /blog/category1/category2/myblogentry 这样的 URL(使用例如 django-m
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
有没有办法在 R 中创建这样的图表? 以下是图表中显示的数据的摘录: df % group_by(Animal) %>% unite(col=Type, Animal:Name, sep =
我一直在努力处理一些时间戳数据(直到现在才需要处理日期,并且它表明)。希望您能帮忙。 我正在处理来自网站的数据,该数据显示每个客户 (ID) 各自的访问以及这些访问的时间戳。它的分组是指一个客户可能有
我一直在努力处理一些时间戳数据(直到现在才需要处理日期,并且它表明)。希望您能帮忙。 我正在处理来自网站的数据,该数据显示每个客户 (ID) 各自的访问以及这些访问的时间戳。它的分组是指一个客户可能有
我正在尝试完成这段代码: ORDER BY IF(j.groups IS NULL OR j.groups = '', IF(j.title IS NULL, i.title), j.groups)
我有一个非常抽象的问题,因为我不确定如何提出它。我的其中一个 View 上有一个 UIImageView。我想让 ImageView 看起来“压入 super View ”。我不确定技术术语是什么,但
我希望 100% 宽的包含图像的 div 位于我的页面下方。在这些 div 之上,我想要一个 1210 像素宽的 div,我可以在其中放置我的内容。 例子: http://mudchallenger.
我目前正在做一个类似于 http://www.beoplay.com/Products/BeoplayA9#under-the-hood 的元素使用 Javascript、HTML5 和 CSS3。我
我想像上面那样创建图像缩略图..为此,我在下面创建了 XML activity_main.xml
我想知道是否可以定义一个分层 MapReduce 作业?。换句话说,我想要一个 map-reduce 作业,在 mapper 阶段将调用不同的 MapReduce 作业。可能吗?您对如何操作有什么建议
程序设计: A 类,实现较低级别的数据处理 类 B-E,为 A 提供更高级别的接口(interface)以执行各种功能 F 类,它是根据用户输入与 B-E 交互的 UI 对象 在任何给定时间只能有一个
CTE 对我来说有点新,所以我希望有人可以帮助我编写的以下内容将采用类别表并从中构建层次结构以进行显示。我知道这种事情一直被问到,但我认为我的排序情况使它有点独特。 我希望有一些使用 Hierarch
我有关于 的问题群 在聚类分析(层次聚类)中。例如,这是 的完全链式的树状图。虹膜数据集 . 我使用后 > table(cutree(hc, 3), iris$Species) 这是输出 : se
数据 我有以下(简化的)数据集,我们称之为 df从现在开始: species rank value 1
Delphi 2009 中的分层窗口和系统菜单存在问题。也就是说,我们的分层窗口(没有边框)没有系统菜单。当我说系统菜单时,我指的是单击应用程序的图标、右键单击其标题栏或(在 Windows 7 中,
我正在制作一个 pototype HMTL5 Canvas 动画,该动画将导出到 Quicktime。 我有一个动态生成的背景,上面有动态屏蔽的元素。 我可以获取要制作的背景,并将其作为逐帧动画(pn
好吧,我有一个打印棋盘的类和另一个打印国际象棋的类 如何使用 LayeredPane 将它们合并在一起,如上面的示例图片所示?我一整天都在尝试,但似乎没有任何效果。我正在使用 JFrame 打印图片。
这是我的场景。我有两个类(class) ClassA 和 ClassB。 B类继承A类。 我在它们两个上使用@Component注释来使它们成为Spring bean。 @Component publ
这不是一道问题题,而是一道使用工具——leiningen——的题。 在一个主项目下创建分层的 lein 项目是否有优势,如果有,优势是什么? 如果我使用 lein new bene-cmp 创建一个项
我是一名优秀的程序员,十分优秀!