如果第一个条件失败,则在具有较少条件的另一列上进行 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 连接的主要内容,如果未能解决你的问题,请参考以下文章
从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值
如果它们与使用 vba 的条件匹配,则在列中查找最小值和中值
如果在 pyspark 数据帧中后跟连续 5 个“0”,则在条件下获取第一个“1”