Sybase *= к стандарту Ansi с 2 разными внешними таблицами для одной внутренней таблицы

Я пытаюсь перенести какой-то устаревший процедурный код. У меня проблемы с определением синтаксиса стандарта 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")  

4 ответа

Решение

Хорошо, это заняло у меня некоторое время, но попробуйте это:

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

Как создать запрос...

Образец таблицы: Transact

Дата поступления PartyIdno  Catage    Credit/Debit  Amount
------   ---------- ---------- --------- ------------  --------
     1   02-01-2016          1 квитанция C          8 200
     1   02-01-2016          5 Оплата D          8,200
     2   14-02-2016          1 Продажи D 11,200 
     2 14-02-2016 4 Продажи C 6500
     2   14-02-2016          2 Продажи C 4700

Выход
------

Дата ввода PartyIdno Дебет Кредитный баланс
-----  ------     ----------                    ------  -------  -----------                   
                             SubId  SubAmount
                             -----  ---------
  1   02-01-2016      1                                  8 200    8 200 Cr
      02-01-2016               5     8 200 д-р
  2 14-02-2016 1 11 200            3 000 др.
      14-02-2016 4 6500 Cr
      14-02-2016               2     4700 Cr

Оператор SQL:

GLOBALSSS.Open_DB_Connection ()

Dim cmd As New Sql Command ("Выберите T1.ENTRY,COALESCE(T1.PARTYIDNO,T2.PARTYIDNO) AS Цвет ИЗ ТРАНЗАКТА T1 ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ (ВЫБЕРИТЕ PARTYIDNO ИЗ TRANSACT WHERE ENTRY=1) T2  ON 1 = 0 ГДЕ T1.PARTYIDNO=1 ИЛИ T2.PARTYIDNO-1  ", Соединение)

Dim da As New SqlDataAdapter(cmd)

Dim dt As New DataTable

da.Fill(дт)

DataGridView1.DataSource = dt

GLOBALSSS.Close_DB_Connection()
Другие вопросы по тегам