0

誰かが教えてくれることを願っています..

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

これは、テーブル E ランガ日付にないテーブル A から日付を選択するために機能すると思われるコードです...

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

残念ながら、サブクエリは複数の行を返します。

どうやって?

ありがとう

4

4 に答える 4

1

サブクエリがどのようにして複数の行を返したのだろうか? これは、クエリに一致するテーブルに複数の行があるためです。

1 行が必要な場合は、次のように、クエリをもう少し制限する必要があります。

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

Eのどの日付範囲にも含まれていない A のすべての日付が必要な場合、1 つの方法は、範囲内含まれる 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 デモサイトに次のように配置します。

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

望んだ通りに。

于 2012-12-11T09:09:47.357 に答える
0

E のいずれの日付範囲にも含まれない A からすべてのレコードを取得するには、日付範囲内にあるレコードを取得し、その結果にないレコードを選択します。

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
)
于 2012-12-11T09:17:48.650 に答える
0

ここで探しているのは、A の日付が B の開始日と終了日の間にあるレコードが B に存在しない、A の一連のレコードです。

したがって、そのようにクエリを構成することをお勧めします。

何かのようなもの ...

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

テーブルの結合カーディナリティとそのサイズによっては、「John が存在するセットに含まれていない行を検索する」方法よりもパフォーマンスが優れていることがわかる場合があります。これは、ロジックにより直感的に一致することを除けばです。

于 2012-12-11T10:30:53.097 に答える
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
于 2012-12-11T09:10:02.970 に答える