2013-04-29 29 views
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條記錄由內部查詢返回?

感謝

+0

當您嘗試時發生了什麼? – 2013-04-29 11:21:34

+0

@DanBracuk當我嘗試選擇不同的av.id,av.asset_id,av.location,distinct co.name作爲「內容對象名稱」,不同的s時,我在關鍵字'distinct'附近出現語法錯誤。名稱爲「場景名稱...」。謝謝 來自ASSETVERSION AV ...' – Basit 2013-04-29 11:24:49

+0

區別應該只在您的查詢中使用一次 - 選擇不同的field1,field2,field3等... – sgeddes 2013-04-29 11:26:06

回答

1

因爲有你contentobject和/或場景表的多個記錄中加入你的assetversion表你有這個問題。因此,您將獲得重複的資產轉化結果,但是會顯示不同的內容對象和/或場景結果。

Visual Representation of Joins

什麼是你想要的結果嗎?如果您只想從連接的表中返回單個記錄,則可能需要使用諸如MAX之類的聚合。或者如果你想在同一列顯示結果(例如用逗號分隔),由於你使用的是SQL Server(假設爲2005或更高),你可以使用FOR XML來查看。真的取決於你想要的結果。

0

做JOIN,並確保只有一排,2005年之前的SQL的一個非常標準的方式,是這樣的:

... 
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的行0