对于相同的内部表,Sybase * =带有两个不同外部表的Ansi Standard
我正在尝试移植一些遗留的程序代码。 我无法找出ANSI标准语法来产生相同的结果。
下面是我尝试过的许多组合之一。 什么是第二次连接的内部表,是第一次连接的输出还是源表。
请帮助我有很多代码需要更改。
原始SQL语句
select * from
JT1 a, JT2 b, JT3 c
where a.ID *= b.ID
and c.JOB *= b.JOB
我的转换
select *
from JT1 a
left outer join JT2 b
on a.ID = b.ID
right outer join JT3 c
on c.JOB = b.JOB
以下是SQL表定义和示例数据。
Create table JT1 (
ID int(4) not null,
NAME char(20) not null)
Create table JT2 (
ID int(4) not null,
JOB char(20) not null)
Create table JT3 (
JOB char(20) not null,
DUTY char(20) not null)
INSERT INTO dbo.JT1 VALUES(10, "Saunders")
INSERT INTO dbo.JT1 VALUES(20, "Pernal")
INSERT INTO dbo.JT1 VALUES(30, "Marenghi")
INSERT INTO dbo.JT2 VALUES(20, "Sales")
INSERT INTO dbo.JT2 VALUES(30, "Clerk")
INSERT INTO dbo.JT2 VALUES(30, "Mgr")
INSERT INTO dbo.JT2 VALUES(40, "Sales")
INSERT INTO dbo.JT2 VALUES(50, "Mgr")
INSERT INTO dbo.JT3 VALUES("Mgr","Evaluate")
INSERT INTO dbo.JT3 VALUES("Mgr","Reports")
INSERT INTO dbo.JT3 VALUES("Mgr","Meeting")
INSERT INTO dbo.JT3 VALUES("Clerk","Stocking")
INSERT INTO dbo.JT3 VALUES("Clerk","Customer Request")
好吧,我花了一段时间,但尝试这一点:
select a.ID, a.NAME, b.ID, b.JOB, a.JOB, a.DUTY
from (Select * from #jt1
cross join #jt3 ) a
left outer join #jt2 b
on a.ID = b.ID and a.job = b.job
使用左连接运算符多次的问题是,您确实在那里存在隐藏的交叉连接。 这应该会得到正确的结果,至于由于开发人员没有对他们正在做的事情没有做出回应,结果是否一直不正确,只有你可以知道。
原始查询相当于:
select *
from JT1 a
left join JT2 b on a.ID = b.ID
left join JT3 c on c.JOB = b.JOB
*=
相当于left [outer] join
=*
相当于right [outer] join
上一篇: Sybase *= to Ansi Standard with 2 different outer tables for same inner table
下一篇: Position of `INNER JOIN` filtering conditions in a query; `ON` or `WHERE` clause