如果第一个条件失败,则在具有较少条件的另一列上进行 SQL 连接

Posted

技术标签:

【中文标题】如果第一个条件失败,则在具有较少条件的另一列上进行 SQL 连接【英文标题】:SQL join on another column with fewer conditions if first condition fails 【发布时间】:2020-07-29 15:14:08 【问题描述】:

我有一个表,表 1 包含以下列:

我还有一个包含以下列的表格(table2)

我想使用以下逻辑将表 1 与表 2 连接起来:

i) try to match on 
table2.zipcode = (table1.loc_zip_cd if table1.loc_zip_cd is not null 
                 or table1.set_cip_cd if table1.loc_zip_cd is null)
and
table1.year = table2.year and
table1.category = table2.category

如果连接在上述条件下在右侧返回 null,

ii) try to match on
table1.year = table2.st_year
table1.category = table2.category

.. ..

我将如何做到这一点?这是我使用合并的尝试,但没有奏效。 .. ..

get_results = spark.sql(""" select table1.*,table2.zipcode, table2.factor_ppqqrr from table1

                left join table2 on
                
                COALESCE(table1.year= table2.year and
                table1.category=table2.category and
                table2.zipcode =
                CASE
                    WHEN table1.loc_zip_cd IS NOT NULL THEN SUBSTRING(table1.loc_zip_cd,1,3)
                    WHEN table1.set_zip_cd IS NOT NULL THEN SUBSTRING(table1.set_zip_cd,1,3)
                END, 
                table1.year= table2.st_year and
                table1.category=table2.category)
                
                """)

【问题讨论】:

我不熟悉 spark.sql 但知道 sql ,你不能用“OR”代替 COALESCE 吗? 如果第一个返回空值,它会查看第一个条件并进入第二个条件吗? st_year 是否与 year 不同(即每个谓词中使用不同的年份列)? 在所有语言中都是典型的“或”。任何一个条件匹配都会给你结果。如果第一个条件为 false 是否同样视为 null ?还是您的意思是 table1 中的一行不应该同时满足这两个条件?如果您输入一些预期的结果会很好。 【参考方案1】:

加入两次,然后选择你的优惠栏目:

SELECT
  COALESCE(t2a.year, t2b.year),
  COALESCE(t2a.column_you_prefer, t2b.column_youll_accept),
FROM
  table1
  LEFT JOIN table2 t2a
  ON  
    t2a.zipcode = COALESCE(table1.loc_zip_cd, table1.set_cip_cd) AND
    t2a.year = table1.year AND
    t2a.category = table1.category

  LEFT JOIN table2 t2b
  ON
    t2b.year = table1.year AND
    t2b.category = table1.category

【讨论】:

以上是关于如果第一个条件失败,则在具有较少条件的另一列上进行 SQL 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何根据MySQL中的另一列有条件地选择列

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

如果它们与使用 vba 的条件匹配,则在列中查找最小值和中值

如果在 pyspark 数据帧中后跟连续 5 个“0”,则在条件下获取第一个“1”

如果另一列中的相应行包含特定值,我想使用条件格式突出显示一列中的单元格

根据聚合值条件标记行