让我们再次提出问题---
table1{date, bID, sName, fID}
{11/05,B1,A1,P1}
{12/05,B2,A2,P2}
{13/05,B1,A3,P1}
{15/05,B3,A4,P1}
{16/05,B1,A5,P2}
{19/05,B1,A6,P2}
这是表,并且还指定了存储在表中的数据......
现在我想要的查询是: -
根据fId(假设选择了P1),它应该显示来自表格的数据,例如11 / 05-17 / 05(不应该错过任何日期)。检索的数据如下: -
11/05,B1,A1
12/05,--,--
13/05,B1,A3
14/05,--,--
15/05,B3,A4
16/05,--,--
17/05,--,--
显示为特定fID(例如P1)检索的数据。解释结果......
1)它显示了11 / 05-17 / 05的所有数据,其中fId是P1,如果数据库中没有日期,那么它也应显示该日期的空值(即14/05日期不在那里在数据库中,但它仍显示为空值)..
2)如果该特定日期的fId不是P1,那么它也会在结果集中存储空值。
在结果集中检索数据,并进一步处理..
所以我想为这个问题编写查询,是否可能..
答案 0 :(得分:3)
这里没有代码,只是我的想法。
您需要创建一个临时表,其日期范围从开始日期到结束日期(含)。然后left join
table1
使用date
列上的临时表加上where fID = ?
。
答案 1 :(得分:1)
正如其他答案所提到的那样,一张包含所有日期的表格,以及LEFT JOIN
就是您所需要的。
说你有这张桌子:
CREATE TABLE table1
{
date DATETIME
bID VARCHAR(10),
sName VARCHAR(10),
fID VARCHAR(10)
}
然后是这个日期表:
CREATE TABLE dates
(
dt DATETIME
)
在此表中,您需要拥有要显示的范围的所有日期。通常你会在两个方向上填充它几年,但这取决于你。
注意:为简单起见,我没有在任何一个表中使用主键。您当然应该确保拥有主键,对于dates
表,它可以是dt
列。
然后显示您想要的结果:
SELECT
dt,
bID,
sName
FROM
dates
LEFT JOIN table1 ON dt = date AND fld = 'P1'
ORDER BY
dt
请注意,仅在P1
条件中选择JOIN
行。如果添加WHERE
子句来执行相同操作,则会丢失所有没有数据的日期。