【问题标题】:SQL- make all rows show a column value if one of the rows has itSQL-如果其中一行具有列值,则使所有行都显示列值
【发布时间】:2012-11-01 04:43:33
【问题描述】:

我有一个 PICK 表的 SQL 语句,它返回订单的标题/详细信息记录。 SQL中的一个字段,基本上就是说有没有危险品的字段。如果订单上的单个产品有代码,则报告应显示其危险。

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

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

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

【问题讨论】:

  • 如果我正确阅读了您的问题,标题包含危险品字段,如果标题包含危险品的有效值,则所有详细信息记录都需要包含该字段。如果是这种情况,您是否尝试过CROSS JOIN
  • 嗨。不,详细记录包含危险品代码。如果一个字段有危险品代码,我需要所有字段都有代码,这样报表设计者才会选择这个字段(如在报表中,字段在表头上,表头看最后一行)返回的 SQL)。我几乎需要在危险品列上使用聚合(例如MAX)...

标签: sql foxpro


【解决方案1】:
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 则表示有危险。如果它是 Null,那么没有什么是危险的。

如果您不能进行嵌套查询,那么您应该能够为嵌套选择创建一个类似视图的对象(在 VFP8 中称为 query):

SELECT HeaderId, COUNT(*) AS DangerousItems FROM Detail WHERE Dangerous = 1 GROUP BY HeaderId

然后你能留下加入吗?

【讨论】:

  • VFP8 不支持 FROM 子句中的派生表-子查询 :(
  • 好的,但是按照建议在嵌套选择上创建一个查询并加入它怎么样?
  • 我必须调查一下。我真的无权将视图添加到数据库中-嗯,这就是您的建议,不是吗?创建一个视图(我来自 Oracle)并加入它,就好像它是一个表一样?
  • 是的,就是这个想法。要尝试的另一件事是创建一个函数,该函数运行嵌套查询并返回是否有危险并使用它来填充报告。
  • 函数的想法听起来不错.. 虽然我不知道从哪里开始使用 FoxPro 创建函数。再说一次,我是 Oracle 人,而 FoxPro 是完全不同的东西!
【解决方案2】:

在 VFP 8 和更早版本中,最好的办法是连续使用三个查询:

选择 Header.HeaderId, Header.HeaderDescription, Detail.DetailId、Detail.DetailDescription、Detail.Dangerous、 Danger.DangerousItems 从头 INNER JOIN 详细信息在 Header.HeaderId = Detail.HeaderId INTO CURSOR csrDetail

SELECT HeaderId, COUNT(*) AS DangerousItems 从细节 危险的地方 按 HeaderId 分组 INTO CURSOR csrDanger

选择 csrDetail.*, csrDanger.DangerousItems FROM csrDetail.HeaderID = csrDanger.HeaderID INTO CURSOR csrResult

【讨论】:

  • 不幸的是,这也行不通。该软件基本上为您构建您的查询.. 因为它有一个用于 SELECT、FROM、WHERE、GROUPBY、HAVING、INTO 和 ORDERBY 子句的文本框。它从这些构建 SQL,所以我看不出我将如何进行多个查询。
猜你喜欢
  • 2020-10-01
  • 2023-03-23
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2022-10-09
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
相关资源
最近更新 更多