【问题标题】:SQL insert null value when join delivers no result当连接没有结果时SQL插入空值
【发布时间】:2022-01-15 05:02:22
【问题描述】:

我有三张桌子

articleoffer_test_u
   id | randomId    | articleOfferId | TestBegin  | ArticleId
   1  | 12345678    | 38             | 2021-12-08 | 74        
   2  | 12345679    | 1              | 2021-12-08 | 1        
   3  | 12345677    | 1              | 2021-12-08 | 1        

articleoffer_feature_test_u
   ArticleOfferTestId | FeatureId     
   1                  | EXAMPLE1       
   1                  | EXAMPLE2             
   1                  | EXAMPLE3     
   2                  | EXAMPLE1        
   2                  | EXAMPLE3              
   3                  | EXAMPLE3        
   3                  | EXAMPLE2        

featurealias
   Id | FeatureId      | ArticleShortName | FeatureAlias
   1  | EXAMPLE1       | ART1             | EXAMPLE1_E 
   2  | EXAMPLE1       | ART2             | EXAMPLE1_J
   2  | EXAMPLE2       | ART1             | EXAMPLE2_E  

               

我使用这个查询

SELECT amtu.FeatureId, ptu.testBegin
    FROM articleoffer_test_u ptu, articleoffer_feature_test_u amtu
    WHERE ptu.RandomId="12345678" AND ptu.ArticleId=74 AND ptu.articleOfferId=38
    AND ptu.id=amtu.ArticleofferTestId AND amtu.FeatureId IN ("EXAMPLE1", "EXAMPLE2", "EXAMPLE3")

得到这个结果

 FeatureId      | TestBegin
 EXAMPLE1       | 2021-12-08 
 EXAMPLE2       | 2021-12-08
 EXAMPLE3       | 2021-12-08    

我想要的是这样的结果

 FeatureId      | FeatureAlias   | TestBegin
 EXAMPLE1       | EXAMPLE1_E     | 2021-12-08
 EXAMPLE2       | EXAMPLE2_E     | 2021-12-08
 EXAMPLE3       | NULL           | 2021-12-08

我试过这个查询

SELECT amtu.FeatureId, ptu.testBegin, featureAlias.FeatureAlias
    FROM articleoffer_test_u ptu, articleoffer_feature_test_u amtu
    INNER JOIN featureAlias ON featureAlias.FeatureId = amtu.FeatureId AND featureAlias.ArticleShortName = "ART1"
    WHERE ptu.RandomId="12345678" AND ptu.ArticleId=74 AND ptu.articleOfferId=38
    AND ptu.id=amtu.ArticleofferTestId AND amtu.FeatureId IN ("EXAMPLE1", "EXAMPLE2", "EXAMPLE3");

并在缺少EXAMPLE3的地方得到这个结果

 FeatureId      | FeatureAlias   | TestBegin
 EXAMPLE1       | EXAMPLE1_E     | 2021-12-08
 EXAMPLE2       | EXAMPLE2_E     | 2021-12-08

原因是EXAMPLE3没有featureAlias。是否有可能使用连接并为 featureAlias 值插入 null?如果没有,有没有人知道解决问题的不同方法?

【问题讨论】:

  • 我可以建议 LEFT JOIN 吗?
  • 真的那么简单吗?我刚试过,它是。谢谢! :D
  • 今日提示:随处切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且如果需要更容易转换为外连接

标签: mysql sql inner-join


【解决方案1】:

Left Join 会自动完成:

SELECT amtu.FeatureId,
       ptu.testBegin,
       featureAlias.FeatureAlias
FROM   articleoffer_test_u ptu
       INNER JOIN articleoffer_feature_test_u amtu
               ON ptu.id = amtu.ArticleofferTestId
       LEFT JOIN featureAlias
              ON featureAlias.FeatureId = amtu.FeatureId
                 AND featureAlias.ArticleShortName = 'EXMP1'
WHERE  ptu.RandomId = '12345678'
       AND ptu.ArticleId = 74
       AND ptu.articleOfferId = 38
       AND amtu.FeatureId IN ( 'EXAMPLE1', 'EXAMPLE2', 'EXAMPLE3' ); 

【讨论】:

    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多