确保查询在输出中也返回空值

时间:2013-05-22 19:48:47

标签: sql oracle oracle11g

我很好奇如何确保查询返回null值以及其他值。


更新 以下查询应该输出一个表,其中包含位置ID,访问日期访问时间和每次访问的总线名称。下面的查询给出了输出但不包括如下表中的空值。结果也应包括空值。

共有3个表:Location1,bus&访问。所以我使用这个(下面)查询来提取ID并加入所有表。查询仅查找佛罗里达州的访问。


例如,请执行以下查询:

SELECT LOC.LOC_ID, VISIT.VISIT_DATE, VISIT.VISIT_TIME, BUS.BUS_NAME 
FROM BUS, LOCATION1, VISIT
WHERE VISIT.BUS_ID = BUS.BUS_ID 
AND VISIT.LOC_ID = LOCATION1.LOC_ID 
AND BUS.BUS_NAME IN (
SELECT BUS_NAME 
FROM BUS 
WHERE BUS_ID IN (
SELECT BUS_ID 
FROM VISIT 
WHERE LOC_ID IN (
SELECT LOC_ID 
FROM LOCATION1 
WHERE LOC_NAME='Florida')));

让我们假设,有些访问尚未分配总线,因此有些值为null

因此,我相信使用IN运算符会返回值集,但不会返回null值。如果我使用exists而该怎么办?

表格如下所示:

 Loc_name   Loc_id         visit_date          visit_time              bus_name
  Florida     1            26-mar-2009           2:00pm                  xyz
  Florida     3            29-jul-2010           3:00pm                  abc
  Florida     8            22-may-2013           2:50pm                  (null)
  .
  .
  .
希望有人能帮助我。

感谢

更新2:

找到了答案!

SELECT LOC.LOC_ID, VISIT.VISIT_DATE, VISIT.VISIT_TIME, BUS.BUS_NAME 
FROM LOCATION1
LEFT JOIN VISIT ON LLOCATION1.LOC_ID = VISIT.LOC_ID 
LEFT JOIN BUS ON BUS.BUS_ID = VISIT.BUS_ID
WHERE LOC_NAME = 'Florida';

再次感谢!

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题/查询,我认为它可以大大简化(不确定为什么您使用所有IN语句)。尝试使用OUTER JOIN获得所需的结果:

SELECT LOC.LOC_ID, VISIT.VISIT_DATE, VISIT.VISIT_TIME, BUS.BUS_NAME 
FROM LOCATION1 LOC
    LEFT JOIN VISIT ON LOC.LOC_ID = VISIT.LOC_ID
    LEFT JOIN BUS ON VISIT.BUS_ID = BUS.BUS_ID 
WHERE LOC.LOC_NAME='Florida'

答案 1 :(得分:0)

SELECT LOC.LOC_ID, VISIT.VISIT_DATE, VISIT.VISIT_TIME, BUS.BUS_NAME 
FROM BUS, LOCATION1, VISIT
WHERE VISIT.BUS_ID = BUS.BUS_ID(+) 
AND VISIT.LOC_ID = LOCATION1.LOC_ID(+)
AND (BUS.BUS_NAME IN (
SELECT BUS_NAME 
FROM BUS 
WHERE BUS_ID IN (
SELECT BUS_ID 
FROM VISIT 
WHERE LOC_ID IN (
SELECT LOC_ID 
FROM LOCATION1 
WHERE LOC_NAME='Florida'))) OR Bus.Bus_name is null);

您需要执行外连接而不是完全连接,这是(+)表示法的用途。此外,您需要处理bus.Bus_name可能为null的位置。

虽然我不确定(+)在这个实例中的位置,我需要了解visit.bus和bus.bus关联的时间以及visit.loc和位置相关的关系。

虽然我认为这更容易阅读

SELECT LOC.LOC_ID, VISIT.VISIT_DATE, VISIT.VISIT_TIME, BUS.BUS_NAME 
FROM Location1 Loc
LEFT JOIN VISIT on Loc1.Loc_ID = Visit.Loc_ID and Loc_Name = 'Florida'
LEFT JOIN BUS on Bus.Bus_ID = Visit.Bus_ID