[英]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.