1

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

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

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 的使用。

4

2 回答 2

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
于 2013-01-03T10:55:37.837 回答
0

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

SELECT Foo.Content, (SELECT TOP 1 Comment FROM Bar WHERE Bar.ContentCode=Foo.Code) AS [Comment] FROM Foo
于 2013-01-03T10:58:22.793 回答