我有一个表project p
和表invoice i
,它们都有一个project_id字段。我想要一个结果集,其中包含所有来自project
的project_id,其中i.status = "Active"
还包括来自invoice
的所有project_id,其中invoice_date > 2016-01-01
。这是我迄今为止尝试过的查询。SQL OUTER JOIN返回一些空记录 - 为什么?
SELECT
p.project_id
FROM
(SELECT project_id
FROM project
WHERE status = 'Active') p
FULL OUTER JOIN
(SELECT DISTINCT project_id
FROM invoice
WHERE CONVERT(varchar(10),invoice_date, 20) > '2016-01-01') i
ON i.project_id = p.project_id
有在projects
与状态约80项目=活性和在invoice
约120项目自2016年1月1日已被开具发票。上述查询返回约140条记录,这听起来正确(一些非发票活动项目和一些非活动发票项目)。问题是查询大约有一半的project_ids为空(NULL?)。就好像它没有从invoice
中拉出project_ids。请帮我解决这个问题。
下面是结果设置为阵列的短段...
...
[10] => Array
(
[project_id] =>
)
[11] => Array
(
[project_id] => C00F2097-CD36-4497-8B26-0BF59F90B1EA
)
[12] => Array
(
[project_id] => 217F3370-50F2-457E-A4F5-0C09F12E654A
)
[13] => Array
(
[project_id] =>
)
[14] => Array
(
[project_id] => B1A06823-73C8-4691-A3D6-0E1A234516B3
etc...
因为那些是'active'的项目,但没有'invoice_date>'2016-01-01''的发票的相应项目。你可能会遇到这样的情况:发票中没有“活动”项目 – Lamak
在你的选择中包括两个表项目值。我也很疑惑你为什么比较一个字符串值的“日期”?我想它会起作用,因为它是yyyy-mm-dd格式;但对我来说使用日期数据类型比较日期似乎更安全。 – xQbert