Sql 加入从 A table 中选择记录和从 B table 中选择具有条件的匹配记录
Sql Join selecting records from A table and selecting matching records with a condition from B table
我们有 Table A 和 Table B,我们需要的数据在 table A 中,我们使用 table B 来验证我们有匹配 ID 的情况。如果 id 不匹配,我们可以 select 它而不进行验证,但如果它们匹配,我们需要检查日期是否在 date1 和 date2 之间。如果它们在 A 中匹配,我们只检查 B 中的记录; (f.e 我们可以在 table B 中忽略 id=4 因为它不在 A 中);而我们只需要来自 A table.
的数据
我花了太多时间来创建 sql 到 select:
来自TableA但不在tableB(ids,f.eid=1,3)和select匹配记录中的所有匹配记录A.date 在 B.date1 和 B.date2 之间(如果它匹配而不是在 select 之间)
TABLE A
id date col1
1 5/08/2021 11223344
2 15/06/2021 22334411
2 15/04/2021 22223344
3 10/11/2021 22223311
TABLE B
id date1 date2
5 5/08/2021 5/09/2021
2 15/05/2021 15/07/2021
2 15/08/2021 15/09/2021
4 15/08/2021 15/10/2021
结果应如下所示:
id date col1
1 5/08/2021 11223344
3 10/11/2021 22223311
2 15/06/2021 22334411
您的问题的改进方法是在查询中添加您的最后一次尝试。
但据我了解,你的问题可以这样解决:
SELECT A.ID, A.date, A.col1 FROM A
LEFT JOIN B ON A.id = B.id
WHERE (A.Date BETWEEN B.date1 AND b.date2) OR B.date1 IS NULL
- LEFT JOIN 保留 table A
的所有记录
- A.Date BETWEEN B.date1 AND b.date2 根据您的条件过滤匹配的行
- B.Date1 IS NULL 对于 A 中的行在 B
中没有匹配项
因为您想保留 A
中满足您条件的所有行——大概没有重复——我建议使用 exists
和 `not exists:
select a.*
from a
where exists (select 1
from b
where a.id = b.id and
a.date between b.date1 and b.date2
) or
not exists (select 1
from b
where a.id = b.id
);
如果 b
中有多个匹配行,则使用 left join
的解决方案可能会 return 重复行。
我们有 Table A 和 Table B,我们需要的数据在 table A 中,我们使用 table B 来验证我们有匹配 ID 的情况。如果 id 不匹配,我们可以 select 它而不进行验证,但如果它们匹配,我们需要检查日期是否在 date1 和 date2 之间。如果它们在 A 中匹配,我们只检查 B 中的记录; (f.e 我们可以在 table B 中忽略 id=4 因为它不在 A 中);而我们只需要来自 A table.
的数据我花了太多时间来创建 sql 到 select:
来自TableA但不在tableB(ids,f.eid=1,3)和select匹配记录中的所有匹配记录A.date 在 B.date1 和 B.date2 之间(如果它匹配而不是在 select 之间)
TABLE A
id date col1
1 5/08/2021 11223344
2 15/06/2021 22334411
2 15/04/2021 22223344
3 10/11/2021 22223311
TABLE B
id date1 date2
5 5/08/2021 5/09/2021
2 15/05/2021 15/07/2021
2 15/08/2021 15/09/2021
4 15/08/2021 15/10/2021
结果应如下所示:
id date col1
1 5/08/2021 11223344
3 10/11/2021 22223311
2 15/06/2021 22334411
您的问题的改进方法是在查询中添加您的最后一次尝试。 但据我了解,你的问题可以这样解决:
SELECT A.ID, A.date, A.col1 FROM A
LEFT JOIN B ON A.id = B.id
WHERE (A.Date BETWEEN B.date1 AND b.date2) OR B.date1 IS NULL
- LEFT JOIN 保留 table A 的所有记录
- A.Date BETWEEN B.date1 AND b.date2 根据您的条件过滤匹配的行
- B.Date1 IS NULL 对于 A 中的行在 B 中没有匹配项
因为您想保留 A
中满足您条件的所有行——大概没有重复——我建议使用 exists
和 `not exists:
select a.*
from a
where exists (select 1
from b
where a.id = b.id and
a.date between b.date1 and b.date2
) or
not exists (select 1
from b
where a.id = b.id
);
如果 b
中有多个匹配行,则使用 left join
的解决方案可能会 return 重复行。