我创建了以下视图“user_details_merged”:
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 xyz/。
这里的第二个视图正是我需要的:
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 视图由许多不同表的联合组成。有些仅包含用户名和电子邮件,有些仅包含电子邮件和名字/姓氏等。这就是为什么没有唯一键并且由于 UNIONS 而我无法索引视图的原因。这使得不可能在一小时内执行最后一个视图。我当前的解决方法是一个过程,它将 user_details_merged 视图的数据存储在临时表中,并让上面的第二个视图使用该表中的数据。这样我可以将 8000 行的执行时间减少到 7 秒。
还有其他建议吗?
非常感谢 ;)