Sql 火花:相当于不在

Sql 火花:相当于不在,sql,apache-spark-sql,subquery,sql-in,Sql,Apache Spark Sql,Subquery,Sql In,我在Spark SQL中有一个where子句,由于某种原因它不会返回任何记录。我认为它不起作用,所以我想问一下,它的等价物是什么 SELECT c.client_id, current_date() as insert_date FROM CLIENT_SUB c WHERE (c.client_id, insert_date) not in (SELECT client_id, insert_date from CLIENT_SUBSCRIBER_CONTRACT) 我听说我

我在Spark SQL中有一个where子句,由于某种原因它不会返回任何记录。我认为它不起作用,所以我想问一下,它的等价物是什么

SELECT
  c.client_id,
  current_date() as insert_date
FROM
  CLIENT_SUB c
WHERE
  (c.client_id, insert_date) not in (SELECT client_id, insert_date from CLIENT_SUBSCRIBER_CONTRACT)

我听说我可以使用联接来实现这一点,我怀疑子查询的输出中有空值,因为当与包含空值的值匹配时,
不在
不会输出任何内容。试一试

not in (select client_id, insert_date 
        from CLIENT_SUBSCRIBER_CONTRACT
        where coalesce(client_id, insert_date) is not null)

出于您的目的,我建议查看
不存在
,尽管

我怀疑子查询的输出中有空值,因为
不存在
与包含空值的值匹配时不会输出任何内容。试一试

not in (select client_id, insert_date 
        from CLIENT_SUBSCRIBER_CONTRACT
        where coalesce(client_id, insert_date) is not null)

出于您的目的,我建议查看
不存在
,尽管我建议
不存在
:它是
空的
-安全的,而
不存在
不安全-而且通常伸缩性也更好

我还怀疑对
插入日期的引用:你真的是这个意思,还是你真的想要
当前日期()


关于性能,考虑一个索引:代码> clitNySubByLySee合同(clitNo.ID,插入TyDATE)< /> > .P/> < P> >我建议<代码>不存在< /C> >:它是代码> null < /C> >安全,而<代码>不是< < /代码>不是-而且它通常也比例尺更好。

我还怀疑对
插入日期的引用:你真的是这个意思,还是你真的想要
当前日期()


关于性能,考虑一个索引:代码> clitNo.PysByLySee合同(clitNo.ID,插入TyDATE)< /C> > /P>谢谢,您的解决方案起作用了。我的印象是spark中不支持索引。你想到的命令是什么?谢谢,你的解决方案有效。我的印象是spark中不支持索引。你的命令是什么?