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()