处理重复的行:在 SQL 的内部联接中包含 SELECT 语句
Addressing Duplicated Rows: Including a SELECT Statement within an Inner Join In SQL
我正在编写一个 SQL 脚本来生成历史月度数据集。我的问题是我需要在我的数据集中添加一个额外的列,如果我只是使用内部连接语句或左外部连接语句,我的数据集 returns 重复行。
为了解决这个问题,我想我需要在 inner join
中包含一个 SELECT
语句,但是当我尝试这样做时,我的脚本将不会执行。我想知道我是否在 inner join
.
中滥用了 SELECT
关于我的代码的一些背景知识,表 a 和 d 是相同的表,但是我需要同时使用它们来计算字段 PrinPmt
和 IntPmt
。
我的代码:
select
a.acct_id AccountID,
t.act_open_date OpenDate,
a.process_date ProcessDate,
a.acct_type AccountType,
d.payment_nxt_due_amt PaymentDue,
a.cur_bal CurrentBalance,
oza.fee_paid FeesPaid,
d.process_date,
d.cur_bal,
a.cur_bal - isnull(d.cur_bal,0) as PrinPmt,
a.int_paid_total - isnull(d.int_paid_total,0) as IntPmt,
from tb_ln_ozs_accts a
inner join tb.offset_month b
on a.process_date = b.process_date
inner join tb.offset_month c
on b.offset = c.offset+1
left outer join tb_ln_ozs_accts d
on c.process_date = d.process_date
and a.acct_id = d.acct_id
and a.order_no= d.order_no
left outer join tb_oza_pmt_schd_ard oza
on d.process_date=oza.process_date
and d.acct_id = oza.acct_id
and d.order_no= oza.order_no
and d.scheduled_payment_date = oza.payment_eff_date
inner join (
select
dzn.acct_nbr_id,
dzn.order_no,
t.act_open_date
from
tb_dzn_order_scd dzn
GROUP BY dzn.acct_id , dzn.order_nbr
) on a.acct_id = dzn.acct_nbr_id and a.order_no= DZN.order_no
where
and a.process_date >= '2015-01-01'
order by a.process_date, a.acct_id, a.order_no
你真的很接近,但还需要多走一步。
在加入的 sub-query 中,您实际上需要命名 sub-query 本身,它会创建一个具有该名称的虚拟 table。然后link那个虚table就正常了。
例如,在下面我将 sub-query 命名为 'dzn_subquery' 并将 dzn 上的连接更改为 dzn_subquery(所有更改都在底线上)。
inner join (
select
dzn.acct_nbr_id,
dzn.order_no,
t.act_open_date
from
tb_dzn_order_scd dzn
GROUP BY dzn.acct_id , dzn.order_nbr
-- changed following line
) AS dzn_subquery on a.acct_id = dzn_subquery.acct_nbr_id and a.order_no= dzn_subquery.order_no
我正在编写一个 SQL 脚本来生成历史月度数据集。我的问题是我需要在我的数据集中添加一个额外的列,如果我只是使用内部连接语句或左外部连接语句,我的数据集 returns 重复行。
为了解决这个问题,我想我需要在 inner join
中包含一个 SELECT
语句,但是当我尝试这样做时,我的脚本将不会执行。我想知道我是否在 inner join
.
SELECT
关于我的代码的一些背景知识,表 a 和 d 是相同的表,但是我需要同时使用它们来计算字段 PrinPmt
和 IntPmt
。
我的代码:
select
a.acct_id AccountID,
t.act_open_date OpenDate,
a.process_date ProcessDate,
a.acct_type AccountType,
d.payment_nxt_due_amt PaymentDue,
a.cur_bal CurrentBalance,
oza.fee_paid FeesPaid,
d.process_date,
d.cur_bal,
a.cur_bal - isnull(d.cur_bal,0) as PrinPmt,
a.int_paid_total - isnull(d.int_paid_total,0) as IntPmt,
from tb_ln_ozs_accts a
inner join tb.offset_month b
on a.process_date = b.process_date
inner join tb.offset_month c
on b.offset = c.offset+1
left outer join tb_ln_ozs_accts d
on c.process_date = d.process_date
and a.acct_id = d.acct_id
and a.order_no= d.order_no
left outer join tb_oza_pmt_schd_ard oza
on d.process_date=oza.process_date
and d.acct_id = oza.acct_id
and d.order_no= oza.order_no
and d.scheduled_payment_date = oza.payment_eff_date
inner join (
select
dzn.acct_nbr_id,
dzn.order_no,
t.act_open_date
from
tb_dzn_order_scd dzn
GROUP BY dzn.acct_id , dzn.order_nbr
) on a.acct_id = dzn.acct_nbr_id and a.order_no= DZN.order_no
where
and a.process_date >= '2015-01-01'
order by a.process_date, a.acct_id, a.order_no
你真的很接近,但还需要多走一步。
在加入的 sub-query 中,您实际上需要命名 sub-query 本身,它会创建一个具有该名称的虚拟 table。然后link那个虚table就正常了。
例如,在下面我将 sub-query 命名为 'dzn_subquery' 并将 dzn 上的连接更改为 dzn_subquery(所有更改都在底线上)。
inner join (
select
dzn.acct_nbr_id,
dzn.order_no,
t.act_open_date
from
tb_dzn_order_scd dzn
GROUP BY dzn.acct_id , dzn.order_nbr
-- changed following line
) AS dzn_subquery on a.acct_id = dzn_subquery.acct_nbr_id and a.order_no= dzn_subquery.order_no