SQL INNER JOIN重复项将根据条件删除

时间:2018-08-17 01:29:02

标签: sql sql-server tsql

我有以下两个表:

表1

┌──────────┬────────────┬───────────────┐
│ account1 │ Fruit_name │ First_harvest │
├──────────┼────────────┼───────────────┤
│      567 │ Apple      │        201805 │
│      432 │ Mango      │        201809 │
│      567 │ Apple      │        201836 │
└──────────┴────────────┴───────────────┘

表2

┌──────────┬─────────────┬──────────────┬───────────────┬──────────────┬─────────────┐
│ account1 │ Fruit_name  │ Current_Farm │ Previous_Farm │ FirstHarvest │ LastHarvest │
├──────────┼─────────────┼──────────────┼───────────────┼──────────────┼─────────────┤
│      567 │ Apple       │ APFarm       │ AppleYard     │       201801 │      201810 │
│      567 │ Apple       │ APFarm       │ FruitFarm     │       201805 │      201830 │
│      567 │ Apple       │ APFarm       │ FruitMarket   │       201831 │      999999 │
│      567 │ Royal Gala  │ APFarm       │ GrocerWorld   │       201815 │      999999 │
└──────────┴─────────────┴──────────────┴───────────────┴──────────────┴─────────────┘

我的代码:

SELECT DISTINCT a.account1,a.fruit_name,Max(a.first_harvest) first_harvest,b.current_farm,b.previous_farm,b.firstharvest,b.lastharvest
FROM   fruit_harvest_data a 
  INNER JOIN fruit_farm_data b 
    ON a.account1 = b.account1 
    AND CASE WHEN b.fruit_name = 'Apple'    THEN 'Royal Gala'
            ELSE b.fruit_name END =
                CASE WHEN a.fruit_name = 'Apple' THEN 'Royal gala'
                ELSE a.fruit_name END
    WHERE  a.first_harvest BETWEEN b.firstharvest AND b.lastharvest 
GROUP  BY a.account1,a.fruit_name,b.current_farm,b.previous_farm,b.firstharvest,b.lastharvest 
HAVING Max(a.first_harvest) >= 201801 

结果:

┌──────────┬────────────┬───────────────┬──────────────┬───────────────┬──────────────┬─────────────┐
│ account1 │ Fruit_name │ First_harvest │ Current_Farm │ Previous_Farm │ FirstHarvest │ LastHarvest │
├──────────┼────────────┼───────────────┼──────────────┼───────────────┼──────────────┼─────────────┤
│      567 │ Apple      │        201836 │ APFarm       │ FruitMarket   │       201831 │      999999 │
│      567 │ Royal Gala │        201836 │ APFarm       │ GrocerWorld   │       201815 │      999999 │
└──────────┴────────────┴───────────────┴──────────────┴───────────────┴──────────────┴─────────────┘

请求:

由于我们存储数据的方式,我得到了重复的数据。有没有 仅在account1同时具有AppleRoyal Gala的情况下显示结果的方式,则应仅选择Royal Gala

请注意:account1(例如567)可以有多个水果,例如appleroya galmangoorange。但只有在Apple和Royal Gala中都存在的情况下,才应选择Royal Gala。

2 个答案:

答案 0 :(得分:1)

我认为下面应该可以使用

select distinct T.* from 
        (SELECT DISTINCT a.account1,
     case when a.fruit_name='Apple' or a.fruit_name='Royal Gala' then
    'Apple' else a.fruit_name end as fruit_name  ,Max(a.first_harvest) first_harvest,b.current_farm,b.previous_farm,b.firstharvest,b.lastharvest
        FROM   fruit_harvest_data a 
          INNER JOIN fruit_farm_data b 
            ON a.account1 = b.account1 
            AND CASE WHEN b.fruit_name = 'Apple'    THEN 'Royal Gala'
                    ELSE b.fruit_name END =
                        CASE WHEN a.fruit_name = 'Apple' THEN 'Royal gala'
                        ELSE a.fruit_name END
            WHERE  a.first_harvest BETWEEN b.firstharvest AND b.lastharvest 
        GROUP  BY a.account1,a.fruit_name,b.current_farm,b.previous_farm,b.firstharvest,b.lastharvest 
        HAVING Max(a.first_harvest) >= 201801 
    ) as  T

答案 1 :(得分:0)

仍然不清楚您想要在结果集中得到什么-更加完整的期望结果会有所帮助,但要回答有关如何执行的问题:

由于您已经提到Apple / Gala是一个示例,所以我将创建一个新表来包含这些对:

create table replace_list(oldfruit varchar(20), newfruit varchar(20))
insert replace_list values ('Apple','Royal Gala')

然后在您的查询中添加以下内容:

left join replace_list r on r.oldfruit=b.fruit_name
left join fruit_farm_data n on n.account1=a.account1 and n.fruit_name=newfruit

以及您的where子句中,您将检查水果名称没有替换r.oldfruit is null或水果名称有替换的地方,但是服务器场没有水果n.fruit_name is null

where r.oldfruit is null or n.fruit_name is null

其余的查询您可以自己解决。