Joignez trois tables basées sur une seule colonne commune et select la valeur de date maximale

J'ai des tables SQL Server définies comme ceci:

create table users ( user_id int NOT NULL IDENTITY(1,1), name varchar(200), username varchar(200), password varchar(50), encrypted_password varchar(100), email varchar(30), phone_no int, address varchar(200), PRIMARY KEY(user_id) ) create table elecsortingcity ( table_name VARCHAR(50), elecsortingcity_bill_id int NOT NULL IDENTITY(1,1), billing_month_year varchar(50), units_consumed int, user_id int, account_number varchar(100), amount varchar(100), due_date varchar(100), PRIMARY KEY(elecsortingcity_bill_id), FOREIGN KEY(user_id) REFERENCES users(user_id) ); insert into elecsortingcity (table_name, billing_month_year, units_consumed, user_id, account_number, amount, due_date) values ('Elecsortingcity','2015-05-22',13,1,'acc01',2500,'2015-06-22'); create table water ( table_name VARCHAR(10), water_bill_id int NOT NULL IDENTITY(1,1), billing_month_year_date varchar(50), units_consumed int, user_id int, account_number varchar(100), amount varchar(100), due_date varchar(100), PRIMARY KEY(water_bill_id), FOREIGN KEY(user_id) REFERENCES users(user_id) ) insert into water(table_name, billing_month_year_date, units_consumed, user_id, account_number, amount, due_date) values ('Water','2015-04-22',17,1,'acc01',2500,'2015-05-14'); create table telephone ( table_name VARCHAR(10), telecom_bill_id int NOT NULL IDENTITY(1,1), bill_Period varchar(100), user_id int, account_number varchar(100), amount varchar(100), issued_date varchar(50), due_date varchar(50), PRIMARY KEY(telecom_bill_id), FOREIGN KEY(user_id) REFERENCES users(user_id) ) insert into telephone(table_name, bill_Period, user_id, account_number, amount, issued_date, due_date) values ('Telephone', '2015-04-22', 1, 'acc01', 2500, '2015-05-14', '2015-05-18'); 

Le problème est que je veux joindre elecsortingcity tables d' elecsortingcity , d' water et de telephone basées sur l' user id que je dois passer à la question.

Et aussi je veux choisir le timeout maximum des trois tables. Mais, j'ai quelques problèmes avec ça.

S'il vous plaît, quelqu'un peut-il m'aider?

Une méthode consiste à utiliser l' outer apply :

 select u.*, e.*, w.*, t.* from users u outer apply (select top 1 e.* from elecsortingcity e where e.user_id = u.user_id order by e.due_date desc ) e outer apply (select top 1 w.* from water w where w.user_id = u.user_id order by w.due_date desc ) w outer appy (select top 1 t.* from telephone t where t.user_id = u.user_id order by t.due_date desc ) t where u.user_id = @user_id; 

Avec des index sur (user_id, due_date) sur les trois tables, la requête devrait également avoir de très bonnes performances.

Si je comprends bien votre question, vous voulez faire quelque chose comme ceci:

 SELECT MAX(e.due_date) AS ElecsortingcityDueDate, MAX(w.due_date) AS WaterDueDate, MAX(t.due_date) AS TelephoneDueDate FROM user u, elecsortingcity e, water w, telephone t WHERE u.user_id=@user_id AND e.user_id=u.user_id AND w.user_id=u.user_id AND t.user_id=u.user_id AND GROUP BY u.user_id 

Cependant, pour ce faire, vous devez changer le type date_date en DATE, de cette façon vous pouvez calculer la valeur max.