我創建了以下視圖 「user_details_merged」:消除NULL字段從合併連接的ResultSet
SELECT DISTINCT
coalesce(own.user_name, join_user_name.user_name) AS user_name,
coalesce(own.email, join_mail.email) AS email,
coalesce(own.first_name, join_name.first_name) AS first_name,
coalesce(own.last_name, join_name.last_name) AS last_name
FROM
user_details AS own
LEFT JOIN user_details AS join_user_name ON
own.user_name IS NULL AND (
(join_user_name.email = own.email AND own.email IS NOT NULL)
OR (join_user_name.first_name = own.first_name AND join_user_name.last_name = own.last_name
AND own.first_name IS NOT NULL AND own.last_name IS NOT NULL))
LEFT JOIN user_details AS join_mail ON
own.email IS NULL AND (
(join_mail.user_name = own.user_name AND own.user_name IS NOT NULL)
OR (join_mail.first_name = own.first_name AND join_mail.last_name = own.last_name
AND own.first_name IS NOT NULL AND own.last_name IS NOT NULL))
LEFT JOIN user_details AS join_name ON
own.first_name IS NULL AND own.last_name IS NULL AND (
(join_name.email = own.email AND own.email IS NOT NULL)
OR (join_name.user_name = own.user_name AND own.user_name IS NOT NULL))
ORDER BY user_name ASC,email ASC, first_name ASC, last_name ASC
這從合併我的專欄:
user_name | email | first_name | last_name
a b NULL NULL
NULL b c d
a NULL e f
NULL x y z
到
user_name | email | first_name | last_name
a b NULL NULL
NULL b c d
a NULL e f
NULL x y z
a b c d
a b e f
我要的是:
user_name | email | first_name | last_name
NULL x y z
a b c d
a b e f
沒有包含ROWS的NULL時,如果存在具有更多信息的相同數據的行,但仍然保留/ NULL x y z /當沒有其他行具有更多信息時。
這裏這第二個觀點不正是我需要的:
SELECT DISTINCT a.user_name,a.email,a.first_name,a.last_name FROM
user_details_merged a
LEFT JOIN user_details_merged b
ON
(
(
a.user_name IS NOT NULL OR
NOT EXISTS (SELECT user_name FROM user_details_merged b WHERE b.user_name IS NOT NULL AND
b.email=ISNULL(a.email,b.email) AND
b.first_name=isnull(a.first_name,b.first_name) AND
b.last_name=isnull(a.last_name,b.last_name))
)
AND
(
a.email IS NOT NULL OR
NOT EXISTS (SELECT email FROM user_details_merged b WHERE b.email IS NOT NULL AND
b.user_name=ISNULL(a.user_name,b.user_name) AND
b.first_name=isnull(a.first_name,b.first_name) AND
b.last_name=isnull(a.last_name,b.last_name))
)
AND
(
(a.first_name IS NOT NULL AND a.last_name IS NOT NULL) OR
NOT EXISTS (SELECT email FROM user_details_merged b WHERE b.email IS NOT NULL AND
b.user_name=ISNULL(a.user_name,b.user_name) AND
b.email=ISNULL(a.email,b.email))
-- AND b.first_name=isnull(a.first_name,b.first_name) AND b.last_name=isnull(a.last_name,b.last_name))
)
AND NOT (a.first_name = b.first_name AND a.last_name = b.last_name AND a.email = b.email AND a.user_name = b.user_name)
)
WHERE coalesce(b.user_name,b.email,b.first_name,b.last_name) IS NOT NULL
的主要問題是,user_details查看,這裏的數據來從由不同表的許多工會。一些只包含用戶名&電子郵件和一些只有電子郵件和名字/姓氏等這就是爲什麼沒有唯一的關鍵,我不能索引視圖,因爲工會。這使得不可能在一小時內執行最後的視圖。 我目前的解決方法是一個過程,它將user_details_merged視圖的數據存儲在臨時表中,並讓上面的第二個視圖使用該表中的數據。這樣我可以將執行時間減少到8000行的7秒。
其他建議?
非常感謝你;)
對不起,我不明白你的問題。什麼是GROUP BY MAX專欄?你想達到什麼目的? – Melanie 2013-02-12 17:20:14
嗨。您可以通過SELECT MAX(user_name),email,MAX(first_name),MAX(last_name).. GROUP BY電子郵件消除包含NULL的行。但是,這將包含user_name = NULL的所有行或消除一個user_name的不同結果 – 5andr0 2013-02-12 17:22:51
它看起來像你試圖重複信息。最大的問題是弄清楚你的ID是什麼。從我所看到和看到的,電子郵件是共同點。有沒有理由不把它當作鑰匙使用? – Heidi 2013-02-13 06:35:06