我有一个使用旧式Oracle连接语法的查询。我正试图将其转换为T-SQL以反映数据存储更改。
我的查询是:
SELECT
client_name1,
personal_business_ind,
birth_date,
sex
FROM
client ce,
exclusions_endorsements ee
WHERE
ce.client_reference = :clientid
AND ee.fourth_insert(+) = ce.client_reference
AND ee.identification_code(+) = 'OCCP1'
ORDER BY
ee.run_date_last_trans DESC;
有人能帮忙吗?
我尝试了以下查询,但它似乎没有在SQL Server上产生正确的输出:
SELECT
client_name1,
personal_business_ind,
birth_date,
sex
FROM
client ce,
RIGHT OUTER JOIN
[CLOAS].[EE_ExclusionsEndorsements] ee ON ee.fourth_insert = ce.client_reference AND ee.identification_code = 'OCCP1'
WHERE
ce.client_reference = @clientid
ORDER BY
ee.run_date_last_trans DESC;
你很接近了。但是外部连接表是exclusions_endorsements
,而不是client
,所以你需要一个LEFT OUTER JOIN
。在你的查询中,FROM client ce
后面多了一个逗号。
还有一点:Oracle在降序排序时首先对空进行排序,SQL Server最后对空进行排序。SQL Server不支持标准的SQL语法NULLS FIRST
。因此,我们需要一个case表达式。
SELECT
client_name1,
personal_business_ind,
birth_date,
sex
FROM client ce
LEFT OUTER JOIN exclusions_endorsements ee
ON ee.fourth_insert = ce.client_reference
AND ee.identification_code = 'OCCP1'
WHERE
ce.client_reference = @clientid
ORDER BY
CASE WHEN ee.run_date_last_trans IS NULL THEN 1 ELSE 2 END,
ee.run_date_last_trans DESC;
我应该补充一下,如果您限定了所有列,那么查询看起来会更好。例:ce.client_name1
;按未选择的列排序会使结果看起来完全无序。好吧,也许它是一个非空列,在这种情况下,它只会将结果中的外部连接行与内部连接行分开。
这是"Oracle外连接操作符。例如:
SQL> select d.deptno, max(e.ename) ename
2 from dept d, emp e
3 where e.deptno (+) = d.deptno
4 group by d.deptno
5 order by d.deptno;
DEPTNO ENAME
---------- ----------
10 MILLER
20 SMITH
30 WARD
40
你应该使用
SQL> select d.deptno, max(e.ename) ename
2 from dept d left join emp e on e.deptno = d.deptno
3 group by d.deptno
4 order by d.deptno;
DEPTNO ENAME
---------- ----------
10 MILLER
20 SMITH
30 WARD
40
SQL>
或者,在你的例子中,
SELECT
client_name1,
personal_business_ind,
birth_date,
sex
FROM exclusions_endorsements ee left join client ce on ee.fourth_insert = ce.client_reference
AND ee.identification_code = 'OCCP1'
WHERE
ce.client_reference = :clientid
ORDER BY
ee.run_date_last_trans DESC;