2015-12-07 68 views
2

外部引用我有一個查詢爲:如何消除子查詢

SELECT DISTINCT A2P.p_year [Year], A2P.aid [CoAuthor] 
FROM sub_aminer_author2paper A2P 
WHERE pid IN (
       SELECT A2P.pid 
       FROM sub_aminer_author2paper A2P 
       JOIN sub_aminer_paper P ON A2P.pid = P.pid 
       WHERE DATALENGTH(P.p_abstract) > 0 AND 
       A2P.aid IN (
          SELECT aid 
          FROM Authors 
         ) AND A2P.p_year BETWEEN 2005 AND 2014 
      ) 
AND A2P.aid NOT IN (
        SELECT aid 
        FROM Authors 
        ) 
ORDER BY Year, CoAuthor 

該查詢給我輸出:

Year CoAuthor 
2005 796 
2005 947 
2005 1032 
2005 1740 
2005 1960 
2005 4045 
2005 4472 
... 
... 

而我想有輸出:

Author Year CoAuthor Venue 
677  2005 796  234565 
677  2005 947  127634 
677  2005 1032  235487 
1359  2005 1740  341265 
1359  2005 1960  23658 
1359  2005 4045  3412 
1359  2005 4472  235473 
... 
... 

我手動添加的列是aid的部分查詢,即SELECT aid FROM Authors。如何選擇?而我也使用A2P.aid NOT IN (SELECT aid FROM Authors),因爲我不想在CoAuthor列中顯示Author列。
請幫忙。

+0

@Thorsten KETTNER額外添加的列即'Venue'在另一個名爲表'sub_aminer_paper' – maliks

回答

1

因此,您只需列出每年的所有作者/共同作者團隊。從sub_aminer_author2paper中選擇時,您已經擁有所有作者和共同作者,但您必須確定誰是誰以及誰與誰一起工作。爲了這樣做,從它使用的CTE(WITH子句),並選擇兩次:

with a2p as 
(
    select 
    aid, pid, p_year, 
    case when aid in (select aid from authors) then 'author' else 'co-author' end as what 
    from sub_aminer_author2paper 
    where p_year between 2005 and 2014 
    and pid in (select pid from sub_aminer_paper where datalength(p_abstract) > 0) 
) 
select distinct a.aid as [Author], a.p_year as [Year], c.aid as [CoAuthor] 
from (select * from a2p where what = 'author') a 
join (select * from a2p where what = 'co-author') c on c.pid = a.pid 
order by ...; 
+0

@Thorsten ---非常感謝你! – maliks

+0

@ Thorsten - 如果我想在輸出中添加如上所示的另一列,那麼將如何修改您的查詢 – maliks