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

我能夠在每個人的最大聯系日期加入有聯系時刻的人(因此我在上面的示例中為 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 會導致一些問題,但是如果我完全洗掉它,我的查詢將不會停止運行并且我會超時。任何人都可以幫助我,因為我無法弄清楚。
uj5u.com熱心網友回復:
洗掉額外的不必要的加入聯系:
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。
uj5u.com熱心網友回復:
您需要 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
uj5u.com熱心網友回復:
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

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/412273.html
標籤:
上一篇:SQL查詢重復值
