2017-06-03 59 views
0

我有兩個表提及並轉推連接兩個表中的Oracle

提及

ID  USER_SCREEN_NAME  USER_ID MENTIONED_USER_ID MENTIONED_USER_NAME 
15   user1    1   9     user 9 
16   user 1   1   60     user 6 
18   user 3   3   60     user 6 
17   user 4   4   60     user 6 

轉推

ID USER_ID USER_SCREEN_NAME RETWEETED_STATUS_ID RETWEETED_USER_STATUS_ID RETWEETED_USER_NAME 
19  3  user 3     400     40   user 4 
11  1  user 1     38      60   user 6 
15  2  user 2     500     50   user 5 
13  4  user 4     38      60   user 6 

我要的是與信息的單獨的表,如果用戶已提到或轉推或完成兩者都包含在表格中,所以輸出應該是這樣的(User_id(M)被提及的用戶ID並且User_ID(R)被轉推用戶ID)

USER_ID (M) USER_ID (R) USER_S_NAME MENTIONED_USER RETWEETED_USER 
    1    1   user 1   user 6   user 6 
    1    1   user 1   user 9   Null 
    3    3   user 3   user 6   Null 
    3    3   user 3   Null    user 4 
    4    4   user 4   user 6   user 6 
    Null   2   user 2   Null   user 5 

但是我得到這個結果

USER_ID (M) USER_ID (R) USER_S_NAME MENTIONED_USER RETWEETED_USER 
    1    1   user 1   user 6   user 6 
    1    1   user 1   user 9   Null 
    3    3   user 3   user 6   Null 
    4    4   user 4   user 6   user 6 
    Null   2   Null   Null    Null 

它工作正常提表,但不是轉推表 這裏是我的查詢

SELECT 
    MT.USER_ID AS USER_ID, 
    r.USER_ID AS USER__ID, 
    mt.USER_SCREEN_NAME AS USER_S_NAME, 
    mt.MENTIONED_USER_NAME AS MENTIONED_USER, 
    (
     SELECT 
      RETWEET.RETWEETED_USER_NAME 
     FROM 
      RETWEET 
     WHERE 
      RETWEETED_USER_STATUS_ID = mt.MENTIONED_USER_ID 
     AND ROWNUM = 1 
     AND USER_ID = MT.USER_ID 
    ) AS RETWEETED_USER 

FROM 
    MENTIONS mt 
FULL OUTER JOIN RETWEET r ON MT.USER_ID = r.USER_ID --where MT.M_USER_ID=r.O_USER_ID 
GROUP BY 
    MT.USER_ID, 
    mt.USER_SCREEN_NAME, 
    r.USER_ID, 
    mt.MENTIONED_USER_NAME, 
    MT.MENTIONED_USER_ID, 
    r.RETWEETED_USER_STATUS_ID 
ORDER BY 
    mt.USER_ID 

回答

0

只需添加一個JOIN條款提/ retweet id字段。不需要GROUP BY,也不清楚爲什麼你需要子查詢。然而,你完全想要的結果不能與FULL OUTER JOIN因爲實現將是本作相應的無與倫比的左或右表:

SELECT 
    mt.USER_ID AS "USER_ID (M)", 
    r.USER_ID AS "USER__ID (R)", 
    mt.USER_SCREEN_NAME AS "USER_S_NAME", 
    mt.MENTIONED_USER_NAME AS "MENTIONED_USER", 
    r.RETWEETED_USER_NAME AS "RETWEETED_USER" 

FROM 
    MENTION mt 
FULL OUTER JOIN RETWEET r ON mt.USER_ID = r.USER_ID 
    AND mt.MENTIONED_USER_ID = r.RETWEETED_USER_STATUS_ID 

ORDER BY mt.user_id, r.user_id 

-- USER_ID (M) USER__ID (R) USER_S_NAME  MENTIONED_USER RETWEETED_USER 
-- 1   1    user 1   user 6   user 6 
-- 1   (null)   user1   user 9   (null) 
-- 3   (null)   user 3   user 6   (null) 
-- 4   4    user 4   user 6   user 6 
-- (null)  2    (null)   (null)   user 5 
-- (null)  3    (null)   (null)   user 4 

SQL Fiddle它採用PostgreSQL的9.3作爲方言,因爲甲骨文被稱爲不工作在小提琴中。

+0

最後兩列User_S_names丟失,因​​爲我們正在使用「mt」並採取提到的表columb是他們的方式來包括在一個列? :/ – melissa

+0

調查['COALESCE()'](https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm#SQLRF00617) – Parfait

+0

已經做到了。 coalesce工作:) – melissa