2016-02-19 70 views
0

我們正在爲我們的數據庫模式添加一個表。它與已經存在的表格有關係,我們爲其添加了一個外鍵。請注意,我沒有創建這個模式,也沒有改變太多的權限。該應用程序已經運行了一段時間,他們猶豫改變很多。SQL左加入兩個可能的列

USER_ACTIVITY_T(preexisint表 - 唯一的相關列簡稱)

  • ACTIVITY_ID(PK)
  • 用戶名
  • 設備ID(FK - 最近添加)

MACHINE_T(新表)

  • machineid(pk - 自動遞增)
  • 計算機名(唯一)

從我加入到機臺點,它收集機器數據;讓用戶看到活動期間涉及哪些機器。這很有用,但它只顯示實施數據。一位領導問我試圖通過參考與機器相關聯的用戶名來填充先前存在的記錄。我們知道這不是100%準確的,但是...是的。我們的想法是將用戶名添加到MACHINE_T中,並以追溯方式在報告中填充機器名稱(假定用戶只使用一臺機器並且從未更改其用戶名)。

那麼,新MACHINE_T表看起來像:

MACHINE_T(新表)

  • 設備ID(PK - 自動遞增)
  • 計算機名(唯一)
  • 用戶名

現在,我們目前的SQL是:

SELECT * FROM `USER_ACTIVITY_T` LEFT JOIN `MACHINE_T` 
ON MACHINE_T.machineid=USER_ACTIVITY_T.machineid 

如果USER_ACTIVITY_T.machineid爲空但具有匹配的用戶名,任何人都有關於如何加入用戶名的建議?對不起。這是一個奇怪的要求,我可能花費太多時間進行過度分析。感謝您的任何幫助。我幾乎想要說它可以合理完成。

回答

1

您想要選擇連接列不爲null時的連接,並且當它爲空時從b選擇連接。

但是你不想重複信息,所以UNION可能會自行產生問題。

嘗試只選擇第一個連接上的非空條目,然後在將它們合併之前排除第二個連接中的空條目。

所以:

SELECT * 
    FROM `USER_ACTIVITY_T` 
    LEFT JOIN `MACHINE_T` 
    ON MACHINE_T.machineid = USER_ACTIVITY_T.machineid 

    UNION ALL 

    SELECT * 
    FROM `USER_ACTIVITY_T` 
    JOIN `MACHINE_T` 
    ON MACHINE_T.username = USER_ACTIVITY_T.username 
    WHERE USER_ACTIVITY_T.machineid IS NULL 

你基本上使用的空條目一個查詢,一個是不爲空項,UNIONing他們這樣。

+1

'SELECT * FROM USER_ACTIVITY_T LEFT JOIN MACHINE_T ON MACHINE_T.machineid = USER_ACTIVITY_T.machineid WHERE USER_ACIVITY_T.machineid IS NOT NULL'如果** ** MACHINE_T.machineid不爲空,所以這是一個INNER JOIN LEFT OUTER代替JOIN你可以切斷where子句 – jean

+0

是真的。我複製了粘貼原始查詢並添加了忽略連接的子句。我將編輯答案以反映這 – Anton

+0

實際上,左連接無論如何都在做這項工作。我會澄清 – Anton

0

而且,我剛剛發現了UNIION算子,它可以幫助我解決這個問題。但是,我接受其他解決方案。