我正在尝试迁移一些旧的过程代码。我在弄清楚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

多次使用该左联接运算符的问题是您那里确实有一个隐藏的交叉联接。这应该得到正确的结果,关于结果是否一直是由于开发人员没有完全理解他们所做的事情而导致的结果是不正确的,只有您知道。

关于sql - Sybase * =符合Ansi Standard,对于同一内部表有2个不同的外部表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12186549/

10-11 01:22