我需要实现旧样式的SQL外部连接,并将其与新样式一起使用。
我无法转换with连接条件的最后一行。
旧式查询:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd, balcontractinstance bci
WHERE cpd.customer_ref = bci.customer_ref(+)
AND cpd.contract_seq = bci.contract_seq(+)
AND cpd.end_dat >= bci.start_dat(+) AND cpd.end_dat <= bci.end_dat(+);发布于 2017-10-31 18:57:23
我假设您将从oracle语法转到sqlserver等,这需要ansi语法,通常情况下,最好使用ansi语法,而不考虑数据库。
Select a.a,b.a From a left join b on a.a = b.a
等同于
Select a.a, b.a From a, b Where a.a = b.a(+)
发布于 2017-10-31 18:58:57
我相信这就是你想要的:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd LEFT JOIN
balcontractinstance bci
ON cpd.customer_ref = bci.customer_ref AND
cpd.contract_seq = bci.contract_seq AND
cpd.end_dat >= bci.start_dat AND
cpd.end_dat <= bci.end_dat;一般规则是,使用(+)引用的表会添加额外的行。这使它成为LEFT JOIN中的第二个表。
发布于 2017-10-31 19:10:15
旧式查询:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd, balcontractinstance bci
WHERE cpd.customer_ref = bci.customer_ref(+)
AND cpd.contract_seq = bci.contract_seq(+)
AND cpd.end_dat >= bci.start_dat(+)
AND cpd.end_dat <= bci.end_dat(+);‘'New’风格的查询:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd LEFT JOIN balcontractinstance bci
ON cpd.customer_ref = bci.customer_ref
AND cpd.contract_seq = bci.contract_seq
AND cpd.end_dat >= bci.start_dat
AND cpd.end_dat <= bci.end_dat;正如您所看到的,它非常相似。
https://stackoverflow.com/questions/47033604
复制相似问题