我有一个内部查询
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条记录?
由于
答案 0 :(得分:1)
您遇到此问题,因为您的contentobject和/或场景表中有多个记录连接到您的assetversion表。因此,您将获得重复的资产转换结果,但不同的内容对象和/或场景结果。
Visual Representation of Joins
您期望的结果是什么?如果您只想从连接表中返回单个记录,则可能需要使用MAX
之类的聚合。或者,如果要在同一列(例如逗号分隔)中显示结果,因为您使用的是SQL Server(假设为2005或更高版本),您可以查看使用FOR XML
。真的取决于你想要的结果。
答案 1 :(得分: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
的行