Ще бъде болезнено; много болезнено.
Вашият въпрос не е ясен относно този проблем, но предполагам, че „потребителското име“, за което говорите, е потребителското име. Има последващи модификации, които трябва да направите, ако това не е наред.
Както при всяка сложна заявка, изграждайте я на етапи.
Етап 1:Колко ненулеви полета има на запис?
SELECT username, sex, date_of_birth, zip,
CASE WHEN sex IS NULL THEN 0 ELSE 1 END +
CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
CASE WHEN zip IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
FROM users_log
Етап 2:Какъв е максималният такъв брой полета за дадено потребителско име?
SELECT username, MAX(num_non_null_fields) AS num_non_null_fields
FROM (SELECT username, sex, date_of_birth, zip,
CASE WHEN sex IS NULL THEN 0 ELSE 1 END +
CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
CASE WHEN zip IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
FROM users_log
) AS u
GROUP BY username
Етап 3:Изберете (всички) редове за даден потребител с този максимален брой ненулеви полета:
SELECT u.username, u.sex, u.date_of_birth, u.zip
FROM (SELECT username, MAX(num_non_null_fields) AS num_non_null_fields
FROM (SELECT username, sex, date_of_birth, zip,
CASE WHEN sex IS NULL THEN 0 ELSE 1 END +
CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
CASE WHEN zip IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
FROM users_log
) AS u
GROUP BY username
) AS v
JOIN (SELECT username, sex, date_of_birth, zip,
CASE WHEN sex IS NULL THEN 0 ELSE 1 END +
CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
CASE WHEN zip IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
FROM users_log
) AS u
ON u.username = v.username AND u.num_non_null_fields = v.num_non_null_fields;
Сега, ако някой има няколко реда с (да кажем) и трите попълнени полета, тогава всички тези редове ще бъдат върнати. Вие обаче не сте посочили критерии, по които да избирате между тези редове.
Основните техники тук могат да бъдат адаптирани към всякакви променени изисквания. Ключът е да създавате и тествате подзаявките, докато вървите.
Нито един от тези SQL не е бил близо до СУБД; може да има грешки в него.
Не сте посочили коя СУБД използвате. Изглежда обаче, че Oracle няма да хареса нотацията AS, използвана за псевдоними на таблици, въпреки че няма проблем с AS на псевдоними на колони. Ако използвате друга СУБД, не трябва да се притеснявате за тази малка ексцентричност.