【问题标题】:SQL query Parent-child distinctSQL查询父子不同
【发布时间】:2009-05-12 19:49:09
【问题描述】:

我有一对 SQL 服务器表。

P 包含 id 和 name。 PR 包含 id、interestrate、tiernumber、fromdate、todate 和 P.id。 PR 可能包含每个 p.id / tier 列出的许多行。 (等级是产品在任何给定日期期间可能具有的费率列表。)

例如:产品 1 第 1 层从 2008 年 1 月 1 日到 2009 年 1 月 1 日开始,显示 6 个费率,每个费率 1 行。产品 1 层 2 开始于 2009 年 1 月 2 日等等等等等等

我需要一个显示 P.name 和 PR.tiernumber 和日期的视图...但我只想要一行来表示层。

这很简单:

SELECT DISTINCT P.ID, P.PRODUCTCODE, P.PRODUCTNAME, PR.TIERNO, 
  PR.FROMDATE, PR.TODATE, PR.PRODUCTID
FROM dbo.PRODUCTRATE AS PR INNER JOIN dbo.PRODUCT AS P 
  ON P.ID = PR.PRODUCTID
ORDER BY P.ID DESC

这给了我正确的数据......但是:这不允许我看到 PR.ID,因为这会否定不同的。

我需要限制结果集,因为用户只需要查看层列表,我需要查看显示所有数据的 PR.ID。

有什么想法吗?

【问题讨论】:

  • “我需要查看 PR.ID”是什么意思? WHICH PR.ID,因为每行有很多,你只能显示一个。每个 P.ID/Tier 或每个 PR.ID 都有一行。
  • 抱歉 - 我需要向应用程序返回一个唯一 ID。用户希望查看产品的所有层,然后希望能够选择一个在屏幕上更充分地填充。我需要找到所选项目的层号,然后使用它来获取其余数据......但如果它具有唯一 ID,应用程序只能给我层号。

标签: sql sql-server parent-child


【解决方案1】:
SELECT P.ID, P.ACUPRODUCTCODE, P.PRODUCTNAME, PR.TIERNO, 
  PR.FROMDATE, PR.TODATE, PR.PRODUCTID, MIN(PR.ID)
FROM dbo.PRODUCTRATE AS PR INNER JOIN dbo.PRODUCT AS P 
  ON P.ID = PR.PRODUCTID
GROUP BY P.ID, P.ACUPRODUCTCODE, P.PRODUCTNAME, PR.TIERNO, 
  PR.FROMDATE, PR.TODATE, PR.PRODUCTID
ORDER BY P.ID DESC

应该完成这项工作。 GROUP BY 代替 DISTINCT,使用汇总函数 (MIN) 来获取 PR.ID 的特定值。

【讨论】:

  • 是的,这会返回一个特定的 PR.ID 值,但是从 OP 的问题 他需要哪个 PR.ID 值(它可能不是 MIN)中并不清楚。也许他会澄清。
  • 在这种情况下,我认为 MIN 比 SUM 更有意义。 ;-)
  • 您先生,是一位学者,一位绅士。刚试过这个,效果很好。非常感谢。
  • Bill,我只需要一个带有这个tiernumber 的ID,然后我使用这个tiernumber 获取数据。
【解决方案2】:

听起来你想用同一个查询完成两件不同的事情,这没有意义。您要么需要产品/等级/日期信息列表,要么需要利率列表。

如果您想选择一个特定的 PR.ID 来处理您的数据,那么您需要确定规则是什么 - 是什么决定了您想要取回哪个 ID?

【讨论】:

  • 汤姆,谢谢。是的,我受到应用程序的限制。我正在做的是获得一个视图来限制用户的选项,以便他们只看到一个产品有 5 层。当他们决定查看历史等级时,他们选择了一个选项,然后我获取该等级的所有费率......我需要为应用程序提供一个唯一 ID,以便它可以将其返回给我,以便我可以运行下一个获取。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多