0

我有一个内部查询

select * from ASSETVERSION  where id in (
    select ASSETVERSION_ID from scene_asset where scene_id in(
        select scene_id from contentobject_scene where contentobject_id in(
            select id from contentobject where course_id = 34660
        )
    )     
)
and LOCATION is not null

当我运行此查询时,我得到 27 条记录。现在我将此查询转换为连接,例如

select av.* from ASSETVERSION av
inner join scene_asset sa on av.id = sa.assetversion_id
inner join scene s on s.id = sa.scene_id
inner join contentobject_scene co_s on s.id = co_s.scene_id
inner join contentobject co on co.id = co_s.contentobject_id
inner join course c on c.id = co.course_id 
where
    c.id = 34660
    and av.location is not null

当我运行此查询时,我得到 36 条记录。当我从 更改为av.*distinct av.*,我得到 27 条记录作为内部查询返回。

当我从 更改为distinct av.*distinct av.id, av.asset_id, av.location, co.name as "Content Object name", s.name as "Scene Name" from ASSETVERSION av,我再次获得 36 条记录。

distinct av.id, av.asset_id, av.location --, co.name as "Content Object name", s.name as "Scene Name" from ASSETVERSION av工作正常。平均返回 27 条记录。

有什么办法我可以应用不同的co.name as "Content Object name", s.name as "Scene Name"喜欢

select distinct av.id, av.asset_id, av.location, distinct co.name as "Content Object name",  distinct s.name as "Scene Name" 
from ASSETVERSION av ...

所以我得到与内部查询返回的相同的 27 条记录?

谢谢

4

2 回答 2

1

您遇到此问题是因为您的内容对象和/或场景表中有多个记录连接到您的资产版本表。因此,您将获得重复的资产版本结果,但不同的内容对象和/或场景结果。

连接的可视化表示

你想要的结果是什么?如果您只想从连接的表中返回一条记录,则可能需要使用聚合,例如MAX. 或者,如果您想在同一列中显示结果(例如逗号分隔),因为您使用的是 SQL Server(假设 2005 或更高版本),您可以考虑使用FOR XML. 在这一点上真的取决于你想要的结果。

于 2013-04-29T11:33:38.277 回答
0

在 SQL 2005 之前,进行 JOIN 并确保只有一行的一种非常标准的方法是这样的:

...
FROM Table1 t1
INNER JOIN Table2 t2 ON t2.PK=(
  SELECT TOP 1 PK 
  FROM Table2
  WHERE FK=t1.PK
  ORDER BY SomeColumn)
...

现在使用 SQL 2005+,您可以使用

ROW_NUMBER() OVER (PARTITION BY t1.PK, ORDER BY SomeColumn)

并仅选择行号 = 1 的那些行

于 2013-04-29T13:36:13.877 回答