【问题标题】:SQL Query returns multiple rows of the same record when View includes one-to-many tableView 包含一对多表时,SQL Query 返回同一条记录的多行
【发布时间】:2014-12-12 02:04:45
【问题描述】:

在 MS-SQL 中,我有一个视图“ListingResult”,其中包含表“ListingCategoryXref”和“Listing”中的行。这是视图语句:

SELECT        
    dbo.Listing.ListingName,  
    dbo.Listing.ListingId,  
    dbo.ListingCategoryXref.CategoryId
FROM    dbo.Listing INNER JOIN
        dbo.ListingCategoryXref ON dbo.Listing.ListingId = dbo.ListingCategoryXref.ListingId

GROUP BY 
    dbo.Listing.ListingName, 
    dbo.Listing.ListingId, 
        dbo.ListingCategoryXref.CategoryId

因此,ListingCategoryXref 中的列表可以有很多行。

ListingResult (View)
Listing (table)
ListingId   ListingName     StateId
1           Toms bar        3
2           French place    5

ListingCategoryXref (table)
ListingId   CategoryId
1           10
1           15

下面的查询根据 ListingCategoryXref 每个列表返回一行。

SELECT TOP(26) 
        [ListingResult].[ListingId],
        [ListingResult].[ListingName]
FROM    [ListingResult]     
WHERE   [ListingResult].[StateId] = 3

所以“Tom's Bar”返回两次,因为它有两个类别。我想我可以更改上面的查询,或者更改 SQL 中的 ListingResult 视图。我仍然需要返回 26 个结果,如果我使用带有 ROW_NUMBER() OVER(PARTITION BY ListingId 的包装选择语句,我无法指定这些结果。 (这是真的吗?)我正在使用 LLBLGen 访问数据库,所以如果可能的话,我更愿意更改视图?很抱歉我对 SQL 的了解如此明显。

【问题讨论】:

  • 嘿@Rufyan,我不太确定你在问什么 - 请你澄清一下吗?
  • 您认为 GROUP BY 的目的是什么?它与 SELECT 完全匹配,并且似乎不会做任何事情。
  • @JohnLBevan 我的问题是如何只返回列表表中每条记录的一个实例。
  • @RobP 我离开了小组,因为我使用的示例是来自 Design in SSMS 的编辑版本。这会混淆问题吗?
  • @wewestthemenace 任何实例 - 我实际上并没有使用此特定查询返回任何 ListingCategory 数据。

标签: sql-server llblgenpro


【解决方案1】:

从上面的查询,会返回如下结果...

列表名称 | ListingId | 类别 ID
汤姆斯酒吧 | 1 | 10
汤姆斯酒吧 |1 | 15

如果只希望 Toms bar 返回一次,则需要从结果集中删除 CategoryId 列和 group by 子句,或者将 CategoryId 添加到 agrgate 函数中,并将其从 group by 子句中删除即

SELECT
    dbo.Listing.ListingName,
    dbo.Listing.ListingId,
    COUNT(dbo.ListingCategoryXref.CategoryId) as Categories
FROM dbo.Listing 
    INNER JOIN dbo.ListingCategoryXref ON dbo.Listing.ListingId = dbo.ListingCategoryXref.ListingId
GROUP BY dbo.Listing.ListingName, dbo.Listing.ListingId

哪个会返回...

列表名称 | ListingId | 类别
汤姆斯酒吧 | 1 | 2

你能举一个你想看的例子吗?

【讨论】:

  • 效果很好。谢谢@Spock。最后还是很简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多