2

让我们再次提出问题——

  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,那么它也在结果集中存储一个空值。

Atlast 在结果集中检索数据,并进一步处理..

所以我想为这个问题编写查询,是否有可能..

4

2 回答 2

3

这里没有代码,只是我的想法。

您需要创建一个临时表,其中包含从开始日期到结束日期的日期(包括日期)。然后left join table1使用列上的临时表date加上 add where fID = ?

于 2009-05-13T07:01:53.093 回答
1

正如此处的另一个答案所提到的,一个包含所有日期的表格,并且 aLEFT 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子句来做同样的事情,您将丢失所有没有数据的日期。

于 2009-05-13T07:11:31.673 回答