【问题标题】:Join three tables based on a single common column and select max date value基于单个公共列连接三个表并选择最大日期值
【发布时间】:2016-02-11 08:08:01
【问题描述】:

我有这样定义的 SQL Server 表:

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 electricity
(
    table_name VARCHAR(50),
    electricity_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(electricity_bill_id),
    FOREIGN KEY(user_id) REFERENCES users(user_id)     
);

insert into electricity (table_name, billing_month_year, units_consumed, user_id, account_number, amount, due_date) 
values ('Electricity','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');

问题是我想加入electricitywatertelephone 表,基于我需要传递给查询的user id

我还想从三个表中选择 ma​​ximum due_date。但是,我有一些问题。

请有人帮助我。

【问题讨论】:

  • 每个表中table_name 列的用途是什么?似乎毫无意义 - 表的名称已经定义了它是什么表.....
  • @marc_s 不,这只是为了测试应用程序的目的。与此处无关。

标签: sql sql-server join


【解决方案1】:

一种方法是使用outer apply:

select u.*, e.*, w.*, t.*
from users u outer apply
     (select top 1 e.*
      from electricity 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;

在所有三个表的(user_id, due_date) 上都有索引,查询应该也有很好的性能。

【讨论】:

    【解决方案2】:

    如果我理解你的问题,你想做这样的事情:

    SELECT MAX(e.due_date) AS ElectricityDueDate, MAX(w.due_date) AS WaterDueDate, MAX(t.due_date) AS TelephoneDueDate 
    FROM user u, electricity 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
    

    但是,要这样做,您应该以这种方式将到期日期类型更改为 DATE 你可以计算最大值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多