我有一个PICK表的SQL语句,它返回订单的标题/明细记录。 SQL中的一个字段基本上是一个字段,可以说明是否存在危险品。如果订单上的单个产品有针对它的代码,则报告应显示其危险。
我遇到的问题是在SQL结果中,因为我将代码放在标题部分的报告中(而不是详细信息部分),所以它只在第一行查找代码。
有没有办法通过SQL基本上说“如果其中一行有这个代码,那么所有这些行都有这个代码”?我猜这个子选择会在这里工作......问题是,我使用的是基于FoxPro和FoxPro SQL的遗留系统很糟糕!
编辑:刚检查过,我正在运行VFP8,在FVP9中添加了SELECT语句中的子查询:(
答案 0 :(得分:0)
SELECT Header.HeaderId, Header.HeaderDescription,
Detail.DetailId, Detail.DetailDescription, Detail.Dangerous,
Danger.DangerousItems
FROM Header
INNER JOIN Detail ON Header.HeaderId = Detail.HeaderId
LEFT OUTER JOIN
(SELECT HeaderId, COUNT(*) AS DangerousItems FROM Detail WHERE Dangerous = 1 GROUP BY HeaderId) Danger ON Header.HeaderId = Danger.HeaderId
如果Danger.DangerousItems
> 0那么事情就很危险了。如果它是空的那么没有什么是危险的。
如果你不能做嵌套查询,那么你应该能够为嵌套选择创建一个类似视图的对象(在VFP8中称为query):
SELECT HeaderId, COUNT(*) AS DangerousItems FROM Detail WHERE Dangerous = 1 GROUP BY HeaderId
然后你可以加入吗?
答案 1 :(得分:0)
在VFP 8及更早版本中,您最好的选择是连续使用三个查询:
SELECT Header.HeaderId,Header.HeaderDescription, Detail.DetailId,Detail.DetailDescription,Detail.Dangerous, Danger.DangerousItems 从标题 INNER JOIN细节On Header.HeaderId = Detail.HeaderId INTO CURSOR csrDetail
SELECT HeaderId,COUNT(*)AS DangerousItems 从细节 在哪里危险 GROUP BY HeaderId INTO CURSOR csrDanger
SELECT csrDetail。*,csrDanger.DangerousItems FROM csrDetail.HeaderID = csrDanger.HeaderID INTO CURSOR csrResult