簡體   English   中英

在兩個可能的列上的SQL LEFT JOIN

[英]SQL LEFT JOIN on two possible columns

我們正在向我們的數據庫模式添加一個表。 它與已經存在的表有關系,我們為其添加了外鍵。 提醒您,我沒有創建此架構,也沒有權限進行大量更改。 該應用程序已經運行了一段時間,他們不願意進行太多更改。

USER_ACTIVITY_T(preexisint表-僅引用相關列)

  • activity_id(pk)
  • 用戶名
  • machineid(fk-最近添加)

MACHINE_T(新表)

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

從添加機器表的角度來看,它收集機器數據; 允許用戶查看活動期間涉及的計算機。 這很有用,但僅顯示從實現的角度來看的數據。 一位負責人要求我嘗試通過引用與計算機關聯的用戶名來填充先前存在的記錄。 我們知道這不是100%准確,但是...是的。 我們的想法是將用戶名添加到MACHINE_T中,並用作追溯地填充報告中的計算機名的方式(假定用戶僅使用一台計算機,並且從未更改過用戶名)。

因此,新的MACHINE_T表將如下所示:

MACHINE_T(新表)

  • machineid(pk-自動遞增)
  • 機器名(唯一)
  • 用戶名

現在,我們當前的SQL是:

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

如果USER_ACTIVITY_T.machineid為null但具有匹配的用戶名,是否有人對如何加入用戶名有任何建議? 對不起。 這是一個奇怪的請求,我可能花太多時間進行過度分析。 感謝您的任何幫助。 我幾乎想說它可以合理地做到。

當聯接列不為空時,您要從a選擇聯接;如果聯接列為空,則要從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。

而且,我剛剛發現UNIION運算符將幫助我解決這個問題。 但是,我願意接受其他解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM