簡體   English   中英

從 SQL select 中查找具有不同字符串值的 distinct

[英]Find the distinct with different string values from SQL select

我想刪除重復的行使用 Select 查詢如何刪除重復的行。

以下輸出產生冗余記錄,如何獲得不同的結果?

SELECT E.EMAIL_ID, T.FIRST_NAME, T.LAST_NAME, CY.COUNTRY_ID 
FROM PLAYER P
INNER JOIN PLAYERTYPE T ON P.PLAYER_ID = T.PLAYER_ID
INNER JOIN PLAYER_CONTACT C ON T.PLAYER_ID = C.PLAYER_ID 
INNER JOIN CONTACT_EMAIL E ON E.CONTACT_ID = C.CONTACT_ID
INNER JOIN COUNTRY_TABLE CY ON P.COUNTRY_ID = CY.COUNTRY_ID
WHERE CY.COUNTRY_CODE='AUS'
AND T.PLAYER_TYPE IN ('NEW', 'EXE')

當前Output:

電子郵件ID 國家代碼
標記 克拉克森 dfgh@gmail.com 04
標記 克拉克森 DFGH@GMAIL.com 04
心導管 長矛 tygh@yahoo.com 04
費斯 洛佩斯 fgvhb@yandex.com 04
福克斯 洛佩斯 byvg@google.com 04
福克斯 洛佩斯 BYVG@GOOGLE.COM 04
歐華 史密斯 ghjkjh@sdf.com 04

預計 Output:

電子郵件ID 國家代碼
標記 克拉克森 dfgh@gmail.com 04
心導管 長矛 tygh@yahoo.com 04
費斯 洛佩斯 fgvhb@yandex.com 04
福克斯 洛佩斯 BYVG@GOOGLE.COM 04
歐華 史密斯 ghjkjh@sdf.com 04

嘗試過

SELECT DISTINCT E.EMAIL_ID, T.FIRST_NAME, T.LAST_NAME, CY.COUNTRY_ID 
FROM PLAYER P
INNER JOIN PLAYERTYPE T ON P.PLAYER_ID = T.PLAYER_ID
INNER JOIN PLAYER_CONTACT C ON T.PLAYER_ID = C.PLAYER_ID 
INNER JOIN CONTACT_EMAIL E ON E.CONTACT_ID = C.CONTACT_ID
INNER JOIN COUNTRY_TABLE CY ON P.COUNTRY_ID = CY.COUNTRY_ID
WHERE CY.COUNTRY_CODE='AUS'
 AND T.PLAYER_TYPE IN ('NEW', 'EXE')

SELECT T.FIRST_NAME, T.LAST_NAME, E.EMAIL_ID, CY.COUNTRY_ID 
FROM PLAYER P
INNER JOIN PLAYERTYPE T ON P.PLAYER_ID = T.PLAYER_ID
INNER JOIN PLAYER_CONTACT C ON T.PLAYER_ID = C.PLAYER_ID 
INNER JOIN CONTACT_EMAIL E ON E.CONTACT_ID = C.CONTACT_ID
INNER JOIN COUNTRY_TABLE CY ON P.COUNTRY_ID = CY.COUNTRY_ID
WHERE CY.COUNTRY_CODE='AUS'
AND T.PLAYER_TYPE IN ('NEW', 'EXE')
GROUP BY T.FIRST_NAME, T.LAST_NAME, E.EMAIL_ID, CY.COUNTRY_ID 

這是小提琴

嘗試使用DISTINCT + LOWER

SELECT DISTINCT T.FIRST_NAME, 
                T.LAST_NAME, 
                LOWER(E.EMAIL_ID) AS EMAIL_ID, 
                CY.COUNTRY_ID 
FROM PLAYER P
INNER JOIN PLAYERTYPE T ON P.PLAYER_ID = T.PLAYER_ID
INNER JOIN PLAYER_CONTACT C ON T.PLAYER_ID = C.PLAYER_ID 
INNER JOIN CONTACT_EMAIL E ON E.CONTACT_ID = C.CONTACT_ID
INNER JOIN COUNTRY_TABLE CY ON P.COUNTRY_ID = CY.COUNTRY_ID
WHERE CY.COUNTRY_CODE='AUS' AND T.PLAYER_TYPE IN ('NEW', 'EXE')

Output:

電子郵件ID 國家代碼
標記 克拉克森 dfgh@gmail.com 04
心導管 長矛 tygh@yahoo.com 04
費斯 洛佩斯 fgvhb@yandex.com 04
福克斯 洛佩斯 byvg@google.com 04
歐華 史密斯 ghjkjh@sdf.com 04

此處查看演示。

重復的錯誤似乎有不同的 email 地址,或者不同情況下相同的 email 地址。 嘗試刪除 email 列或簡單地將 Lowercase() 應用於 email (或數據庫引擎中的任何等效項)

使用 DISTINCT 只會掩蓋問題。 它可能會為您提供您喜歡的結果,但它會隱藏一個 gremlin,這會在以后導致問題,尤其是在您最終處理大量數據時的性能方面。

我猜PLAYER_CONTACT每個PLAYER_ID有多行。 如果是這樣,將單行從PLAYER連接到PLAYER_CONTACT將導致多個 output 行。 我還猜測CONTACT_EMAIL每個聯系人可以包含多行。 如果是這樣,加入它將使您的 output 乘以每個聯系人的行數。 因此,如果每個玩家有 5 個聯系人,每個聯系人有 5 個電子郵件,加入這兩個一對多表將導致 25 output 行 這就是導致所有其他列顯示重復值的原因。 現在假設它是 1:10000 和 1:10000...單個玩家將返回 100,000,000 行。 然后,您可以使用 DISTINCT 隱藏它,但是您將使用大量臨時空間和時間寫入/讀取來臨時執行該排序,並且僅隱藏查詢粒度中存在基本概率的事實。

所以這是改變你的查詢方法的問題。 您真的想要所有可能的聯系人以及這些聯系人的所有可能的電子郵件嗎? 或者你想讓每個玩家排成一排? 如果每個玩家一行,您將不得不決定要返回哪個聯系人和哪個 email,或者您需要返回某種 LISTAGG 字符串以在一行中顯示它們。

暫無
暫無

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

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