我很好奇如何确保查询返回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';
再次感谢!
答案 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