我在SQLite3中执行LEFT OUTER JOIN时遇到一些困难,并且无法在StackOverflow的现有文档中找到解决方案,但这可能只是...的反映....
基本上,问题是第二个表没有一些匹配的行,我希望结果集包含这些行的NULL值。
(a)带有列的tblITEMS:
ID (integer, primary key, not null)
DESCR (Text); i.e., description
(b)带列的tblVALUES:
ID (integer, primary key, not null)
ITEM_ID (integer, not null, foreign key to tblITEMS.ID)
VAL_DT (not null); i.e., the valuation date
VALUE (real, not null, default 0)
(a)tblITEMS有五(5)行。
__ID__|_DESCR_|
:----:|:-----:|
1 | Item1 |
2 | Item2 |
3 | Item3 |
4 | Item4 |
5 | Item5 |
(b)tblVALUES有四(4)行与
(bi)两行具有相同的ITEM_ID,但VAL_DT不同
(bii)两行的ITEM_ID与(bi)不同。
(c)有零(0)行匹配两(2)个tblITEM ID。
__ID__|_ITEM_ID_|__VAL_DT_____|__VALUE__|
:----:|:-------:|:-----------:|:-------:|
1 | 1 | 2000-01-01 | 10 |
2 | 2 | 2000-01-01 | 20 |
3 | 2 | 2010-01-01 | 200 |
4 | 3 | 2000-01-01 | 40 |
所需的结果集:
五(5)行,每个tblITEMS行一行,其中包含没有匹配ITEM_ID的tblVALUES列的NULL条目;即不存在。
提供三(3)行的SQL脚本,每行都有来自tblVALUES表的相应值。
select a.ID, a.DESCR, b.ID as VAL_ID, b.ITEM_ID, Date(b.Val_dt) as Val_dt, b.VALUE
from
tblItems a
, tblValues b
--left outer join tblValues on a.id = b.item_id
where
a.id = b.item_id
and
b.val_dt = (Select Max(b.val_dt) from tblValues b where (a.id = b.ITEM_ID))
order by a.id
上面带有“left outer join”行的SQL脚本取消注释,结果集为:
(a)十二(12)行
(b)三(3)个独特行中的每一行的四(4)个副本(与上面4中返回的相同)。唯一的行都具有来自tblVALUES的适当值
(c)对应于tblITEMS的零(0)行,在tblVALUES表中没有对应的行。
问题: 如何修改SQL脚本,以便结果集包含五(5)行,每个tblITEMS行一行,并且包含tblVALUES表中没有相应行的tblITEM行的NULL值?
预期/期望的结果集:
__ID__|_DESCR_|_ITEM_ID_|__VAL_DT_____|__VALUE__|
:----:|:-----:|:-------:|:-----------:|:-------:|
1 | Item1 | 1 | 2000-01-01 | 10 |
2 | Item2 | 2 | 2010-01-01 | 200 |
3 | Item3 | 3 | 2000-01-01 | 40 |
4 | Item4 | NULL | NULL | NULL |
5 | Item5 | NULL | NULL | NULL |
注意:NULL可能为零或“空日期”。
答案 0 :(得分:0)
我正在回答我自己的问题,因为我已经解决了这个问题。
我对解决方案的简单程度感到有些尴尬。
无论如何,我的根本问题是我没有完全理解“JOIN”子句实际上是主要“FROM”子句的一部分,这意味着连接右侧的表及其别名定义应该只出现在join子句中。
实际的解决方案是:
Select a.ID
, a.DESCR
, b.ID AS VALUES_ID
, b.ITEM_ID
, b.VAL_DT
, b.VALUE
FROM tblITEMS a
LEFT OUTER JOIN tblVALUES b ON a.ID = b.ITEM_ID
AND b.val_dt = (Select Max(b.val_dt)
From tblVALUES b
Where a.ID = b.ITEM_ID)
Order by
a.ID
此致 约翰