如何获取表1中但不在表2中的记录?

时间:2016-11-16 18:04:02

标签: sql apache-spark apache-spark-sql

我有两张桌子:排除和kaggleresults。我正在尝试查找excluded中存在的但不存在于kaggleresults

中的记录

计数:

scala> spark.sql("select * from excluded").count()
res136: Long = 4652

scala> spark.sql("select * from kaggleresults").count()
res137: Long = 4635

差异为17

scala> res136-res137
res139: Long = 17

我正试图获得这17条记录。我在下面写了查询,但它返回38

scala> spark.sql("select * from excluded left join kaggleresults on kaggleresults.subject_id = excluded.subject_id where kaggleresults.subject_id is null").count()
res135: Long = 38

问题

我需要写什么查询来获取这17条记录?

4 个答案:

答案 0 :(得分:1)

对于实际记录(不是计数),您可以使用

SELECT * FROM excluded
WHERE subject_id NOT IN ( SELECT subject_id FROM kaggleresults )

但是,如果结果行计数与两个表的各个行计数的差异不匹配,您不应该感到惊讶。

例如:假设table1的id为1,2,3,4和5,table2的id为3,4,5和6. table1和table2的行数分别为5和4相差1,但在table1中实际上有两个记录,其中id为table2中不存在。

答案 1 :(得分:1)

不是 LEFT_ANTI 加入的情况吗?

scala> val excluded = (0 to 5).toDS
left: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> val kaggleresults = (3 to 10).toDS
right: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> excluded.join(kaggleresults, Seq("value"), "leftanti").show
+-----+
|value|
+-----+
|    0|
|    1|
|    2|
+-----+

答案 2 :(得分:0)

不使用关键词 您可以使用以下查询

Select * from excluded where subject_id not in (select subject_id from  kaggleresults)

答案 3 :(得分:0)

使用Not In语法和子查询。

SELECT ID, Name 
FROM   Table1 
WHERE  ID NOT IN (SELECT ID FROM Table2)

SQL query to find record with ID not in another table