簡體   English   中英

SQL 如何連接 2 個有或沒有的表

[英]SQL How to join 2 tables with or without

我有兩張桌子,一張是人,一張是聯系時間。 我想要的是根據聯系日期加入每個人的最大聯系時間。 見下圖。 在此處輸入圖像描述

我可以在有聯系時刻的最大聯系日期加入每個人(因此我在上面的示例中為 John 和 Frank 取回了數據)。 但是,我無法讓沒有聯系時間的人也出現(比爾和凱文)。 為此,我需要幫助。

到目前為止,我所做的如下:

SELECT 
    Person.Id,
    Person.Name,
    Contact.Id
    
FROM
    Person,
    Contact
    RIGHT JOIN (
        SELECT      Contact.PersonId, 
                    MAX(Contact.Date) AS MaxDate
        FROM        Contact
        GROUP BY    Contact.PersonId
    ) GroupedContact ON 
        Contact.PersonId = GroupedContact.PersonId AND 
        Contact.Date = GroupedContact.MaxDate
        
WHERE
    Person.Id = Contact.PersonId

我知道這里的 WHERE 會導致一些問題,但是如果我完全刪除它,我的查詢將不會停止運行並且我會超時。 任何人都可以幫助我,因為我無法弄清楚。

刪除額外的不必要的加入聯系:

SELECT 
    Person.Id,
    Person.Name,
    GroupedContact.MaxDate as outputCol

FROM
    Person
    LEFT JOIN (
        SELECT      Contact.PersonId, 
                    MAX(Contact.Date) AS MaxDate
        FROM        Contact
        GROUP BY    Contact.PersonId
    ) GroupedContact ON 
        Person.PersonId = GroupedContact.PersonId

一些注意事項:永遠不要混合隱式和顯式連接。 始終使用顯式連接。 您在這里需要一個LEFT連接,這意味着 -> 保留LEFT表中的所有記錄以及與RIGHT表匹配的記錄。

您需要 LEFT 加入而不是 RIGHT 並且不需要額外加入聯系人:

SELECT 
    Person.Id,
    Person.Name,
    GroupedContact.MaxDate
    
FROM Person
LEFT JOIN 
(
    SELECT      Contact.PersonId, 
                    MAX(Contact.Date) AS MaxDate
    FROM        Contact
    GROUP BY    Contact.PersonId
) GroupedContact 
  ON Person.Id = GroupedContact.PersonId
    SELECT person.*,m1.date
FROM contant m1 
LEFT JOIN contant m2
 ON (m1.personID = m2.personID AND m1.id < m2.id)
RIGHT JOIN person ON person.id = m1.personID 
WHERE m2.id IS NULL

在此處輸入圖像描述

暫無
暫無

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

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