需要帮助....选择日期不在哪里

时间:2012-12-11 09:06:48

标签: mysql sql plsql

希望有人可以说..

Table A                  Table E
Id  |  Date              Id  |  Start_date  |  End_date
 1     2012-12-10         1     2012-12-09     2012-12-10
 2     2012-12-11         2     2012-12-12     2012-12-14

我希望的结果。
    2012年12月11日

这是我认为可能用于从表A中选择不在表E范围内的日期的代码......

SELECT * FROM `A` 
WHERE `A`.`DATE` NOT BETWEEN (SELECT `E`.`DATE_START` FROM `E`) AND (SELECT `E`.`DATE_END`       
FROM `E`);

但遗憾的是,子查询返回超过1行。

我不知道怎么样?

感谢

4 个答案:

答案 0 :(得分:1)

您想知道子查询如何返回多行?那是因为表格中有多行符合您的查询。

如果您想要一行,则需要更多地限制查询,例如:

select `e`.`date_start` from `e` where `e`.`id` = 1

如果您希望A中的所有日期都未包含在E中的任何日期范围内,则一种方法是获取 的A日期列表>包含在一个范围内,然后从A获取一个不在那个列表中的日期列表。

类似的东西:

select date
from   a
where  date not in (
           select a.date
           from   a, e
           where a.date between e.start_date and e.end_date
       )

将其通过优秀的phpMyAdmin demo网站:

create table a (id int, d date);
create table e (id int, sd date, ed date);
insert into a (id, d) values (1, '2012-12-10');
insert into a (id, d) values (2, '2012-12-11');
insert into e (id, sd, ed) values (3, '2012-12-09', '2012-12-10');
insert into e (id, sd, ed) values (4, '2012-12-12', '2012-12-14');
select d from a where d not in (
    select a.d from a, e where a.d between e.sd and e.ed
    );

导致输出:

2012-12-11

根据需要。

答案 1 :(得分:0)

如果表A中的Id与表E中的Id相同:

SELECT *
FROM A, E
WHERE A.Id = E.Id
AND A.Date NOT BETWEEN E.Start_Date AND E.End_Date

答案 2 :(得分:0)

要从A中获取不在E中任何日期范围内的所有记录,请获取日期范围内的记录,并选择不在该结果中的记录:

select *
from A
where Id not in (
  select A.Id
  from A
  inner join E on A.Date between E.Start_date and E.End_date
)

答案 3 :(得分:0)

你在这里寻找的是A中的记录集,其中B中没有记录,其中A中的日期在B中的开始日期和结束日期之间。

因此我建议您以这种方式构建查询。

像...一样的东西。

 Select ...
 From   table_A
 Where  not exists (
          Select null
          From   table_b
          Where  ...)

根据表的连接基数及其大小,您可能会发现这比“查找不存在于约会的集合中的行”方法更好,除了它更直观的匹配你的逻辑。