我希望在记录中组合两个表之间的 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的使用。
答案 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