SQL-使所有行显示列值,如果其中一行有它

时间:2012-10-31 03:38:44

标签: sql foxpro

我有一个PICK表的SQL语句,它返回订单的标题/明细记录。 SQL中的一个字段基本上是一个字段,可以说明是否存在危险品。如果订单上的单个产品有针对它的代码,则报告应显示其危险。

我遇到的问题是在SQL结果中,因为我将代码放在标题部分的报告中(而不是详细信息部分),所以它只在第一行查找代码。

有没有办法通过SQL基本上说“如果其中一行有这个代码,那么所有这些行都有这个代码”?我猜这个子选择会在这里工作......问题是,我使用的是基于FoxPro和FoxPro SQL的遗留系统很糟糕!

编辑:刚检查过,我正在运行VFP8,在FVP9中添加了SELECT语句中的子查询:(

2 个答案:

答案 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