【问题标题】:SQL: Compare two tables on part of entry without INNER JOINSQL:在没有 INNER JOIN 的情况下比较两个表的部分条目
【发布时间】:2017-12-13 09:39:35
【问题描述】:

我正在尝试选择表 A 中满足表 B 某些条件的所有条目。

在表 A 中,我有物种样本,其中包含 date、site、sample_id(站点和日期的组合)和 taxon 列。

在表 B 中,我有包含 date、site、sample_id 列的环境数据样本。

我想获取表 A 的所有物种样本,其中环境样本(表 B)是在同一地点和 2005 年采集的。 但是,日期列的格式为 yyyy-mm-dd 而不是 yyyy。

我尝试了以下代码:

SELECT tableA.site AS Asite, tableB.site AS Bsite, tableA.date AS Adate, tableB.date AS Bdate, tableA.taxon
FROM tableA
INNER JOIN tableB
ON Asite = Bsite
WHERE (Adate BETWEEN '2005-01-01' AND '2005-12-31')
AND (Bdate BETWEEN '2005-01-01' AND '2005-12-31')

这产生了一个表格,其中包含 2005 年内在同一地点采样的不同采样日期的所有组合。分类单元条目被多次列出。我有一张这样的桌子:

网站 |网站 |日期 |日期 |分类单元

BY | BY | 2005-07-17 | 2005-03-22 | Navicula antonii
BY | BY | 2005-07-16 | 2005-03-22 | Navicula antonii
BY | BY | 2005-07-17 | 2005-04-19 | Navicula antonii
BY | BY | 2005-07-16 | 2005-04-19 | Navicula antonii

但是,我不希望在一个日期采样的物种被列出两次。该表应如下所示:

**Asite | Bsite | Adate | Bdate | taxon**
BY | BY | 2005-07-17 | 2005-03-22 | Navicula antonii
BY | BY | 2005-07-16 | 2005-03-22 | Navicula antonii

我希望我能以某种方式解释我的问题,如果有人知道解决方案,我将不胜感激。

也许我应该以不同的方式解决这个问题,并且以某种方式也可以在日期列的年份进行 INNER JOIN...

【问题讨论】:

  • 你能给我们看一个实际输出的样本和你想要的输出吗?
  • 添加示例表数据和预期结果,作为格式化文本(不是图像)。
  • 我刚刚编辑了我的问题以包含这个。

标签: sql postgresql inner-join


【解决方案1】:

我认为您只希望“A”中的每行只有一行。如果是这样,聚合或distinct on 可能是您想要的:

SELECT DISTINCT ON (a.site, a.date, a.taxon) a.site AS Asite, b.site AS Bsite, a.date AS Adate, b.date AS Bdate, a.taxon
FROM tableA a INNER JOIN
     tableB b
     ON a.Asite =b. Bsite
WHERE a.Adate BETWEEN '2005-01-01' AND '2005-12-31' AND
      b.Bdate BETWEEN '2005-01-01' AND '2005-12-31'
ORDER BY a.site, a.date, a.taxon, b.date;

【讨论】:

    【解决方案2】:

    试试INTERSECT:

    SELECT site, date
      FROM tableA
    INTERSECT
    SELECT site, date
      FROM tableB
     WHERE ( date BETWEEN '2005-01-01' AND '2005-12-31' );
    

    【讨论】:

      【解决方案3】:

      这就是我认为你想要的:

      create table species_sample
      (
          sample_date      date,
          site             varchar(32),
          taxon            Varchar(32)
      );
      
      create table environmental_sample
      (
          sample_date      date,
          site             varchar(32)
      );
      
      insert into species_sample (sample_date, site, taxon) values ('2005-07-17', 'BY', 'Navicula antonii');
      insert into species_sample (sample_date, site, taxon) values ('2005-07-17', 'CZ', 'Navicula abiskoensis');
      insert into species_sample (sample_date, site, taxon) values ('2005-07-17', 'AX', 'Navicula abscondita');
      
      insert into environmental_sample (sample_date, site) values ('2005-04-19', 'BY');
      insert into environmental_sample (sample_date, site) values ('2006-04-19', 'CZ');
      
      
      # select * from species_sample;
       sample_date | site |        taxon         
      -------------+------+----------------------
       2005-07-17  | BY   | Navicula antonii
       2005-07-17  | CZ   | Navicula abiskoensis
       2005-07-17  | AX   | Navicula abscondita
      (3 rows)
      
      # select * from environmental_sample;
       sample_date | site 
      -------------+------
       2005-04-19  | BY
       2006-04-19  | CZ
      (2 rows)
      
      select 
          site,
          sample_date,
          taxon
      from
          species_sample
      where
          site in
          (
              select site 
              from environmental_sample
              where extract('year' from sample_date) = 2005
      );
      

      结果:

       site | sample_date |      taxon       
      ------+-------------+------------------
       BY   | 2005-07-17  | Navicula antonii
      (1 row)
      

      注意“提取”以从日期中获取年份。

      两个表中的站点必须相同,因此无需在结果集中两次列出该列。

      您想要 environment_sample 表中的日期吗?如果有,是哪一个?最早的?如果您确实需要 environment_sample 表中的日期,请告诉我,我会给您修改后的查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 2014-05-25
        • 2020-02-20
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 2011-12-21
        相关资源
        最近更新 更多