是否可以限制连接返回的结果?

时间:2013-01-03 10:50:12

标签: sql join sql-server-2008-r2 inner-join

我希望在记录中组合两个表之间的 1到多关系。假设我有一个名为 Foo 的表和另一个名为 Bar 的表。 Foo 包含一些内容,包含对此内容的评论。现在我想列出所有内容和第一条评论。

这是我到目前为止所尝试的:

SELECT T0.[Content], T1.[Comment]
FROM [Foo] I0 
    INNER JOIN [Bar] T1 ON T1.[ContentCode] = T0.[Code]

这给了我很多次内容和许多评论。换句话说,我说“将所有评论与其代表内容相结合”。我想要达到的目的是说“只将一个评论与内容结合起来”。所以我尝试了这个:

SELECT DISTINCT T1.[CommentCode], T0.[Content], T1.[Comment]
FROM [Foo] I0 
    INNER JOIN [Bar] T1 ON T1.[ContentCode] = T0.[Code]

这很好用。使用ORDER BY我可以告诉查询使用 Bar 中的第一个或最后一个记录。

但由于某种原因,我们被迫使用数据库适配器不支持DISTINCT

您是否面临另一种限制联合关系右侧结果的可能性?

提前致谢! :)

修改

我在MSSQL Server 2008(R2)上,但使用SAP Business One DI API访问它。这限制了T-SQL的使用。

2 个答案:

答案 0 :(得分:3)

一种相当便携的方法是在子查询中查询单个注释的ID:

SELECT  T0.Content
,       T1.Comment
FROM    Foo I0 
JOIN    Bar T1 
ON      T1.ID = 
        (
        SELECT  max(ID)
        FROM    Bar T2
        WHERE   T2.ContentCode = T0.Code
        )

如果SQL Server为每一行执行子查询,请考虑使用此版本:

SELECT  T0.Content
,       T1.Comment
FROM    Foo T0
JOIN    (
        SELECT  ContentCode
        ,       max(ID) as MaxID
        FROM    Bar
        GROUP BY
                ContentCode
        ) filter
ON      filter.ContentCode = T0.ContentCode
JOIN    Bar T1
ON      T1.ID = filter.MaxID

答案 1 :(得分:0)

如果你只关心1条评论,为什么不这样的子查询:

SELECT Foo.Content, (SELECT TOP 1 Comment FROM Bar WHERE Bar.ContentCode=Foo.Code) AS [Comment] FROM Foo