【问题标题】:WebMatrix - Inner Join and Foreach loopWebMatrix - 内连接和 Foreach 循环
【发布时间】:2013-12-17 16:39:51
【问题描述】:

我正在尝试做一些我经常看到的事情,但我无法找到最好的方法。

我有以下疑问:

"SELECT * FROM Property_Info INNER JOIN RateInfo ON Property_Info.PropertyID=RateInfo.RateID"

由此,我执行以下 foreach 循环来显示我的所有属性。

foreach(var row in queryResults){
<div class="row">
    <h4>@row.PropertyName</h4>
    <h5>Prices from: xxxx</h5>
    </div>
}

我遇到的问题是,我需要在连接表 (RateInfo) 上执行“SELECT TOP 1”以显示每个属性的最低价格。我需要在我放 xxxx 的 foreach 循环中显示这个

我需要编写单独的 SQL 查询吗?如果是这样,我如何将它绑定到 foreach 循环中的相应条目。

表信息:

Property_Info 表 - 物业编号, 属性名称

RateInfo 表 - PropertyID(这与另一个表中的 PropertyID 匹配), 费率ID, 费率名称, 率值

【问题讨论】:

  • 你能把所涉及的两个表的架构贴出来吗?
  • 完成了,希望这就是您需要的吗?正如我试图解释的那样。每个属性都可以有几个与之相关的费率,但我只想在我的 foreach 循环中显示最便宜(或最贵)的费率。那么由 foreach 循环生成的每个属性都显示出最便宜的价格?
  • 为了确保我理解你的意思,你的问题中的Property_Info.PropertyID=RateInfo.RateID 应该是Property_Info.PropertyID=RateInfo.PropertyID,对吗?
  • 啊,是的,对不起!我正在尝试一些东西,所以一定忘了恢复。很好发现。

标签: c# sql razor foreach webmatrix


【解决方案1】:
SELECT
    pi.PropertyID,
    pi.PropertyName,
    MIN(ri.Rate) AS LowestRate,
    MAX(ri.Rate) AS HighestRate
FROM
    Property_Info pi
INNER JOIN
    RateInfo ri ON pi.PropertyID = ri.PropertyID
GROUP BY
    pi.PropertyID,
    pi.PropertyName

对代码的更改是在表名上使用别名,以便更容易再次引用它们,并使用GROUP BY 让我们对RateInfo 表中的数据执行聚合函数。希望这就是您所需要的吗?

【讨论】:

  • 这正是我所需要的,它工作得很好。我以前从未使用过别名,但看起来它会让我的查询看起来更整洁一些。此外,我从未使用过 GROUP BY,但它工作得很好。我需要对此进行一些阅读以了解它是如何工作的。
【解决方案2】:

如果不知道表结构,这有点困难,但我假设 RateInfo 作为每一行的唯一 ID。既然如此:

SELECT * FROM Property_Info pi
cross JOIN RateInfo ri
where ri.RateId = (select max(ri2.RateId) from RateInfo ri2 where ri2.RateId = pi.PropertyId)

...或者代替你可以使用的 max(ri2.Id):

select top 1 ri2.RateId from RateInfo ri2...

干杯-

选择 * 从 Property_Info pi cross JOIN RateInfo ri where ri.Id = (select max(ri2.Id) from RateInfo ri2 where ri2.RateId = pi.PropertyId)

注意 ri.Id = (select max(ri2.Id) ...。这个 Id 是我假设存在于 RateInfo 上的唯一字段。 道歉..

【讨论】:

  • 谢谢!我不确定你用 pi 和 ri 实现了什么,但我会试一试,希望我能得到我需要的结果。谢谢:)
  • pi 和 ri(和 ri2)是“关联”名称:基本上是表的简写名称。这就是您如何在两次使用 RateInfo 时获得同一张表的方法,但您的意思是完全明确的。
  • 另外 - 对不起,有一个错字:我已经编辑了答案以更正它,否则它将不起作用。
  • 出于性能原因,这是一种糟糕的方法。 WHERE 子句中的子查询将对(完全不必要的)CROSS JOIN 的每个结果执行一次。
  • 实际上,取决于 DBMS,它不会。在 SQL Server 2012 中查看类似查询的查询计划显示了连接两个表的嵌套循环 - 不是最有效的,但没有像“每个结果一次”这样的。现代 RDBMS 的行为并非如此。
猜你喜欢
  • 2015-10-30
  • 2018-01-04
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2016-09-26
相关资源
最近更新 更多