我一直在努力产生一个结果,其中多个查询返回更多限制性返回。如何查看完整列表以及满足更严格条件的记录?查询1返回给定县的538个站点记录。
SELECT E_SITES.ID "SITE ID",
E_SITES.NAME "SITE NAME",
E_SITES.ADDR_1 "SITE ADDRESS"
E_SITES.CITY_NAME || ', ' || E_SITES.STATE_CODE || ' ' || E_SITES.POSTAL_CODE,
E_SITES.COUNTY_NAME
FROM E_SITES
WHERE E_SITES.COUNTY_NAME IN ('ALLAMAKEE', 'BENTON', 'BLACK HAWK', 'BREMER', 'BUCHANAN', 'CHICKASAW', 'CLAYTON', 'DELAWARE', 'DUBUQUE')
ORDER BY E_SITES.ID
查询2返回已识别联系人的网站数。这是503条记录。
SELECT E_SITES.ID "SITE ID",
E_SITES.NAME "SITE NAME",
E_SITES.ADDR_1 "SITE ADDRESS"
E_SITES.CITY_NAME || ', ' || E_SITES.STATE_CODE || ' ' || E_SITES.POSTAL_CODE,
E_SITES.COUNTY_NAME,
E_INDIVIDUALS.FIRST_NAME || ' ' || E_INDIVIDUALS.LAST_NAME
FROM E_SITES, E_AFFILIATIONS, E_INDIVIDUALS
WHERE E_SITES.SITE_ID = E_AFFILIATIONS.SITE_ID
AND E_AFFILIATIONS.INDIVIDUAL_RID = E_INDIVIDUALS.RID
AND E_AFFILIATIONS.AFFILIATION_TYPE = ('SITE_CONTACT')
AND E_SITES.COUNTY_NAME IN ('ALLAMAKEE', 'BENTON', 'BLACK HAWK', 'BREMER', 'BUCHANAN', 'CHICKASAW', 'CLAYTON', 'DELAWARE', 'DUBUQUE')
ORDER BY E_SITES.ID
进一步的查询会返回带有邮寄地址的网站,这会将结果减少到486条记录。我需要获取所有538条记录,无论它们是否有联系地址或邮寄地址,对于那些记录,每个网站都有一行。
其他信息
对于查询1,我当前的结果可能如此(为清晰起见,包括列标题,区分数据元素的引号):
“网站ID”“网站名称”“网站地址”“城市,国家邮政”“COUNTY_NAME”
“09698”“BODINE ELECTRIC”“18114 KAPP DR”“PEOSTA,IA 52067”“BREMER”
“16895”“BRUGGEMAN LUMBER”“3003 WILLOW RD”“HOPKINTON,IA 52237”“DELAWARE”
“40047”“GENEVIEVE,LLC”“707 LINCOLN ST”“GARNAVILLOR,IA 52052”“CLAYTON”
查询2要求联系人当前只返回符合要求的记录,即使我使用(+)运算符。
“网站ID”“网站名称”“网站地址”“城市,国家邮政”“COUNTY_NAME”“名称最后一个名称”
“40047”“GENEVIEVE,LLC”“707 LINCOLN ST”“GARNAVILLOR,IA 52052”“CLAYTON”“DALE KARTMAN”
我得到1条记录而不是3条记录,其中2条记录没有联系人,1条记录有联系人。这是我的困境。我必须分别运行每个查询,获取结果并将它们复制到电子表格中。然后我必须将记录与联系人姓名对齐到所有设施的第一个查询。非常劳动密集。希望这有助于澄清我的需求。
答案 0 :(得分:0)
如果我理解正确,那就是您正在寻找的OUTER JOIN
。
这是一个简单的例子(基于Scott的EMP和DEPT表),它显示了它是什么。
DEPT表中有4个部门:
SQL> select deptno from dept order by deptno;
DEPTNO
----------
10
20
30
40
但是,没有员工在部门40工作:
SQL> select deptno, ename from emp order by deptno;
DEPTNO ENAME
---------- ----------
10 KING
10 CLARK
10 MILLER
20 FORD
20 SMITH
20 JONES
30 JAMES
30 TURNER
30 MARTIN
30 WARD
30 ALLEN
30 BLAKE
12 rows selected.
SQL>
如果您想显示从这两个表中收集的信息(DEPT表中的部门名称和EMP表中的员工姓名),您就可以加入这些表 - 就像您一样(我会这样做)使用实际 JOINS 表的ANSI语法,而不是枚举它们并将连接条件放入WHERE子句中:
SQL> select d.deptno, d.dname, e.ename
2 from dept d join emp e on e.deptno = d.deptno
3 order by d.deptno;
DEPTNO DNAME ENAME
---------- -------------- ----------
10 ACCOUNTING KING
10 ACCOUNTING CLARK
10 ACCOUNTING MILLER
20 RESEARCH FORD
20 RESEARCH SMITH
20 RESEARCH JONES
30 SALES JAMES
30 SALES TURNER
30 SALES MARTIN
30 SALES WARD
30 SALES ALLEN
30 SALES BLAKE
12 rows selected.
SQL>
看起来不错,但是 - 我想获得有关DEPTNO = 40的信息,尽管没有人在其中工作。所以,使用外连接:
SQL> select d.deptno, d.dname, e.ename
2 from dept d left join emp e on e.deptno = d.deptno
3 order by d.deptno;
DEPTNO DNAME ENAME
---------- -------------- ----------
10 ACCOUNTING KING
10 ACCOUNTING CLARK
10 ACCOUNTING MILLER
20 RESEARCH FORD
20 RESEARCH SMITH
20 RESEARCH JONES
30 SALES JAMES
30 SALES TURNER
30 SALES MARTIN
30 SALES WARD
30 SALES ALLEN
30 SALES BLAKE
40 OPERATIONS
13 rows selected.
SQL>
右键!这里是! (注意LEFT JOIN产生与LEFT OUTER JOIN相同的结果;不需要指定"外部",尽管它使得思考更明显)。
此外,还有#34;老" Oracle外连接运算符(+)
(字面意思是括号括起来的+符号)。如果我们这样说,上面的查询也会起作用:
select d.deptno, d.dname, e.ename
from dept d, emp e
where d.deptno = e.deptno (+);
我建议您对(外部联接)查询执行相同的操作。再一次:
查询将更容易阅读和维护,您将知道什么是什么,并且 - 如果有必要(甚至可能是您的情况),如果您使用" old" (+)运算符,您无法将一个表外连接到多个另一个表。随着您越来越深入,您可能需要将某些表外连接到其他几个表,以及ANSI连接发生的位置。
祝你好运!