我正在尝试迁移一些旧的过程代码。我在弄清楚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
多次使用该左联接运算符的问题是您那里确实有一个隐藏的交叉联接。这应该得到正确的结果,关于结果是否一直是由于开发人员没有完全理解他们所做的事情而导致的结果是不正确的,只有您能说得出。