SQL查询包含特定子值的父项

3

我正在创建一个Crystal Reports v12(2008)报告,但找不到使用Crystal提取以下内容的方法。如果有人能用SQL语言回答,我可能会拼凑在一起。

2个表:hbmast、ddmast

SELECT hbmast.custno, hbmast.id, ddmast.name, ddmast.status
WHERE hbmast.custno = ddmast.custno
GROUP BY hbmast.id
pseudo code::show all hbmast values that have ddmast.status = '2'

示例输出:

J0001, 111222, PAUL JONES, 1
       111222, PAUL JONES, 2
       111222, PAUL JONES, 1

K0001, 555333, PETER KING, 3
       555333, PETER KING, 1

我希望报告中显示Paul及其所有子记录,但不要返回Peter的记录,因为他在ddmast.status字段中没有带有“2”的子记录。
谢谢您的帮助。
3个回答

4
我觉得你可能需要这个:

我想你正在寻找以下内容:

select hb.custno, hb.id, dd.name, dd.status from hbmast hb
join ddmast dd on hb.custno = dd.custno
where hb.custno in (
    select custno from ddmast
    where status = '2'
)

请问这个结果是否符合您的预期要求。

2
要在Crystal中实现这一点,需要有hb和dd两个表,然后再创建dd表的第二个别名。接下来,您需要筛选状态为2的dd别名表,然后连接到hb表,最后回到dd表(而不是别名)。SQL语句应该如下所示:
select hb.custno, hb.id, dd.name, dd.status from hbmast hb
inner join ddmast dd on hb.custno = dd.custno
inner join ddmast dd2 on hb.custno = dd2.custno
where dd2.status = '2'

Andomar提出了一个合理的观点,如果每个组中有多个状态为2的记录,则会出现重复记录。如果是这种情况,则您可以按主键分组并在组页脚级别显示行信息,或者使用SQL表达式和子查询来替代双联接方法。
SQL表达式:(select count(*) from ddmast where custno = "hbmast.custno" and status = '2') 然后,在记录选择专家中使用:{%sqlexpression} > 0

非常好的回复,你用一个解决方案打动了我。由于我的结果不多,所以我不会担心如何纠正Andomar的发现。我最终得到了他描述的结果。 - macunte
这怎么可能是对的?dd2别名甚至没有在第二个连接中加入。 - xQbert
@xQbert crystal使用图形化设计工具-我包含的SQL只是一个示例,说明了crystal如何将其翻译:) 我已经纠正了拼写错误。 - Lee Tickett

1

还有一种获取相同结果的不同方法...

SELECT hb.custno, hb.id, dd.name, dd.status 
FROM hbmast hb
INNER join ddmast dd 
  on hb.custno = dd.custno
INNER JOIN DDMAST2 DD2 
  on DD2.custNo = HB.custNo 
  AND DD2.Status='2'

3
如果每个hbmast有多个ddmast,这将创建大量重复的行。Mosty的“where ... in”解决方案似乎更好。 - Andomar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接