首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scala Slick:如何执行except join (带有is null的左外join )?

Scala Slick是一个用于Scala语言的轻量级数据库访问库,它提供了一种函数式的、类型安全的方式来执行数据库操作。在使用Scala Slick进行数据库操作时,可以通过使用Slick的Query API来构建查询语句。

要执行一个带有is null的左外连接(left outer join)并排除某些结果,可以使用Slick的filterjoinLeft方法来实现。下面是一个示例代码:

代码语言:txt
复制
import slick.jdbc.MySQLProfile.api._

// 定义表结构
class TableA(tag: Tag) extends Table[(Int, Option[String])](tag, "table_a") {
  def id = column[Int]("id", O.PrimaryKey)
  def name = column[Option[String]]("name")
  def * = (id, name)
}

class TableB(tag: Tag) extends Table[(Int, Option[String])](tag, "table_b") {
  def id = column[Int]("id", O.PrimaryKey)
  def name = column[Option[String]]("name")
  def * = (id, name)
}

// 创建表对象
val tableA = TableQuery[TableA]
val tableB = TableQuery[TableB]

// 执行查询
val query = for {
  (a, b) <- tableA joinLeft tableB on (_.id === _.id) if b.map(_.name).isDefined
} yield (a, b)

val result = db.run(query.result)

上述代码中,我们定义了两个表TableATableB,并创建了对应的表对象tableAtableB。然后,我们使用joinLeft方法进行左外连接,并使用filter方法过滤掉TableBname字段为null的结果。最后,通过db.run方法执行查询并获取结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

细谈Slick(5)- 学习体会和将来实际应用的一些想法

回顾我学习Slick的目的,产生了许多想法,觉着应该从实际的工作应用角度把我对Slick目前能够达到的目的以及在现有功能优势和特点下如何进一步改进才能正真符合IT系统对数据库程序编程和运行效率的要求。...首先谈谈Slick的特点:主体方面Slick为函数式编程模式带来了SQL编程,可以把数据库表当作scala语言中的集合来对待。...除了能实现FP的函数组合外又避免了嵌入SQL语句式的数据库编程,而且也实现了类型安全(type safe),可以由编译器(compiler)在编译时来捕捉语法错误。...我们也可以用Slick的Query函数组件(combinator)join来达到同样目的,如下: 1 val q14 = for { 2 (c,s) join suppliers...是了,Slick把jdbc的resultset隐藏起来了。其目的可以理解:这样可以实现语法安全(type safety),才能把SQL编程融入FP编程,即scala集合编程。

1.3K80

FunDA(2)- Streaming Data Operation:流式数据操作

的类型就是Slick的DBIO[T]了: 1 package com.bayakala.funda.rowtypes 2 import slick.dbio._ 3 object ActionType...{ 4 type FDAAction[T] = DBIO[T] 5 } 记得有一次在一个Scala讨论区里遇到这样一个问题:如何把a表里的status字段更新成b表的status字段值,转化成SQL...语句如下:  update a,b set a.status=b.status where a.id=b.id 那位哥们的问题是如何用Slick来实现对a表的更新,不能用sql"???"...如果用FunDA的流式操作思路就会很容易解决了,只要用join Query把b.status读出来再用b.id=a.id逐个更新a.status。...先用下面这段代码来设置测试数据: 1 import slick.dbio.DBIO 2 import slick.driver.H2Driver.api._ 3 4 import scala.concurrent.duration

1.4K60
  • SparkSql 中外连接查询中的谓词下推规则

    外连接查询和连接条件 外连接查询(outter join),分为左外连接查询、右外连接查询以及全外连接查询,全外连接使用的场景不多,所以本文重点讨论的是左连接查询和右连接查询。...1的行在右表中能找到相等的id,但是左表的id为1,是不满足第二个join条件(LT.id>1)的,所以左表这一条相当于没有和右表join上,所以左表的值value保留,而右表的value为null(你没满足...然后左表再和右表进行左连接,流程如下: 第一步:左表id为1的行在右表中没有,此时左表值保留,右表为null 第二步:左表id位2的行在右表中有,并且RT.id大于1,两个join条件都满足,则左表和右表的值都保留...那么如果不下推(为了得到正确结果),来看看结果,流程如下: 第一步:左表id为1的行在右表中有,但是不满足第二个join条件,所以这行算是没join上,所以左表数据保留,右表为null 第二步:左表id...,左表右表都不保留,要跟上边的没join上,右表的值为null的情况区别开,这也是关键所在) 第二步:左表id为2的行和右表id为2的行join上了,同时也满足RT.id>1的where条件。

    1.7K90

    经典SQL语句大全之基础

    B: EXCEPT 运算符 EXCEPT运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。...注:使用运算词的几个查询结果行必须是一致的。 12、说明:使用外连接 A、left (outer) join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。...SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right (outer) join: 右外连接...C:full/cross (outer) join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。...统计函数中的字段,不能和普通的字段放在一起; 14、对数据库进行操作: 分离数据库: sp_detach_db;附加数据库:sp_attach_db 后接表明,附加需要完整的路径名 15.如何修改数据库的名称

    1K10

    一些sql

    B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。...http://hovertree.com/menu/sql/ 12、说明:使用外连接 A、left (outer) join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行...SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right (outer) join: 右外连接...C:full/cross (outer) join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。...统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名 14.如何修改数据库的名称

    64920

    (数据科学学习手册28)SQL server 2012中的查询语句汇总

    如果是则返回true,否则返回false; USE practice GO -- 插入一行带有空值的样本 INSERT INTO T VALUES(NULL,NULL,NULL,NULL,'川菜',100,230...JOIN)、外连接(OUTER JOIN);ON子句指定连接条件,它由被连接表中的列和比较运算符、逻辑运算等构成。...  在内连接操作中,只有满足连接条件的记录才能作为结果输出,但有时我们希望看到额外的不满足条件的数据,这时候可以使用外连接(OUTER JOIN)查询来实现:   外连接有三种形式:   1.左外连接...(LEFT OUTER JOIN)     左外连接的结果集中将包含左边表的所有记录(不管右边的表中是否存在满足条件的记录),以及右边表中满足连接条件的所有记录   2.右外连接(RIGHT OUTER...JOIN)     与左外连接正好相反   3.全连接(FULL OUTER JOIN)     左外连接与右外连接的并集 /* 使用左外连接的方式查询在table1和table2中菜系均为自助餐的记录

    6.2K120

    图解数据库内连接、外连接、左连接、右连接、全连接等

    二 左连接(左外连接) 关键字:left join on / left outer join on 语句: select * from a_table a left join b_table bon...说明: left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。...左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。 ?...说明: right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。...与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。 ?

    5.8K52

    MySQL常用SQL语句:插入更新删除查询

    外连接:分为左外连接,右外连接 ,全外连接 左外连接 以JOIN关键字左边的表为基准,没有匹配的记录则置NULL。...left join 表c on 表A字段 = 表c的id 右外连接 以JOIN关键字右边的表为基准,没有匹配的记录则置NULL。...sc.sno 全外连接 以JOIN关键字左右两边的表为基准,没有匹配的记录则置NULL。...mysql不支持full join,但可以通过左外连接 + union + 右外连接来实现(left join + union(可去除重复数据)+ right join) #select * from...自然连接(使用nature join) 自然连接就是USING子句的简化版,它找出两个表中相同的列作为连接条件进行连接。有左自然连接,右自然连接和普通自然连接之分。

    6.7K30

    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    如果右表的某行在左表中没有匹配行,则将为左表返回空值。        3)FULL  JOIN 或 FULL OUTER JOIN 完整外部联接返回左表和右表中的所有行。...外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。...全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。 说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。...但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面SQL在Oracle下执行的结果: 语句10:左外和右外的合集,实际上查询结果和语句9是相同的。...语句11:联合查询(UNION JOIN)例句,还没有找到能执行的SQL环境。

    5.7K10

    什么是内连接、外连接?MySQL支持哪些外连接?_oracle内连接和外连接的区别

    : 外连接 分为左外连接,右外连接 左外连接 left join 语句: select 表1查询的字段,表2查询的字段 from 表1 left join 表2 on 条件; // 只改变了连接的语句...是left outer join的简写,它的全称是左外连接,是外连接中的一种。...左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。...是right outer join的简写,它的全称是右外连接,是外连接中的一种。...与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

    91520

    Apache-Flink深度解析-JOIN 算子

    NULL; FULL -  返回左表和右表的并集,不存在一边补NULL; SELF JOIN - 自连接,将表查询时候命名不同的别名。...: filter push down project push down 如上优化规则以filter push down 为例,示意优化器对执行plan的优化变动: LEFT OUTER JOIN 左外联接语义是返回左表所有行...|  NULL | +------+------+------+-------+ 1 row in set (0.00 sec) 上面查询的执行逻辑上也是分成两步: 第一步:左外联接查询 mysql&...FULL OUTER JOIN 全外链接语义返回左表和右表的并集,不存在一边补NULL,用于演示的MySQL数据库不支持FULL OUTER JOIN。这里不做演示了。...JOIN key P001进行JOIN的事件)需要撤回左边下发的NULL记录,并下发JOIN完整(带有右边事件列)的事件到下游。

    5.6K31

    高效sql性能优化极简教程

    (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。) 一、外连接 外连接可分为:左连接、右连接、完全外连接。...左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL). 注:此时我们不能说结果的行数等于左表数据的行数。...右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。 注:同样此时我们不能说结果的行数等于右表的行数。...完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL...排序是一种昂贵的操作,在一秒钟执行成千上万次的sql语句中,如果带有排序操作,往往会消耗大量的系统资源,性能低下。索引是一种有序结果,如果order by后面的字段上建有索引,将会大大提升效率!

    3.3K50

    学习SQLite之路(三)

    LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)。...一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL 值,将它们附加到结果表中。...(7)比较:(不知道这样算不算正确,我也不是理解的太深刻) 交叉连接后结果非常多,慎用 左外连接会填充NULL,内连接不会 4, SQLite Unions子句:用于合并两个或多个 SELECT 语句的结果...SQLite NULL值: SQLite 的 NULL 是用来表示一个缺失值的项。表中的一个 NULL 值是在字段中显示为空白的一个值。 带有 NULL 值的字段是一个不带有值的字段。...NULL 值与零值或包含空格的字段是不同的,理解这点是非常重要的。 (1)带有 NULL 值的字段在记录创建的时候可以保留为空。

    3K70

    SQL命令 JOIN(一)

    指定隐式联接以执行表与另一个表中的字段的左外联接;指定显式联接以联接两个表。这种隐式联接语法可以很好地替代显式联接语法,或者与显式联接语法一起出现在同一查询中。...LEFT OUTER JOIN 与左连接相同。箭头语法(->)还执行左外部联接。 RIGHT OUTER JOIN 与右连接相同。 FULL OUTER JOIN 与FULL JOIN相同。...对于RIGHT OUTER JOIN,指定的第二个表是连接的源表。 FULL OUTER JOIN是将在两个表上执行左OUTER JOIN和右OUTER JOIN的结果组合在一起的连接。...FULL JOIN不能以NATURAL关键字作为前缀。 尝试这样做会导致SQLCODE -94错误。 ON 子句 内连接、左外连接、右外连接或全外连接都可以有ON子句。...除非用括号分组,否则使用相同逻辑运算符的谓词严格按照从左到右的顺序执行。 ON子句有以下限制: 带有ON子句的连接只能使用ANSI连接关键字语法。

    2.2K20

    10 分钟,带你彻底掌握 SQL 多表查询(建议收藏)

    前言 多表查询,也称为多表连接查询;作为关系型数据库最主要的查询方式,在日常工作中被广泛使用 常见的多表查询操作包含:子查询、内连接、左外连接、右外连接、完全连接、交叉连接 本篇文章将利用一个实例逐一介绍这些操作...,如果内连接没有通过 on 关键字指定条件的话,查询结果和交叉连接查询结果一样,只是执行效率高于交叉连接 3.3 外连接 外连接包含: 左外连接 右外连接 其中, 左外连接:使用关键字 left join...,以左表为准,返回左表的所有数据,右表满足 on 条件的数据会全部显示,否则用 null 值去填充 右外连接:和左外连接相反。...使用关键 right join,以右表为准,返回右表的所有数据,左表满足 on 条件的数据会全部显示,否则用 null 值去填充 首先,我们来看左连接的实例 # 左外连接 select * from...,NULL,2021008,音乐,10,2021-01-18 15:36:00 3.4 完全连接 完全连接,是通过关键字 full join 连接两张表,返回左表和右表的所有数据,并使用 null 值填充缺失的数据

    1.1K10

    MySQL数据篇之多表操作-----保姆级教程

    --返回两张表都满足条件的部分记录 多表查询之外连接 左外连接 注意 右外连接 注意 小总结 可以在update语句中使用inner join和left join 在delet语句中使用join语句...where did=2; 向刚才做的这两个操作(插入一个没有部门的员工和删除一个带有员工的部门),这种情况都是不应该发生的。...,但是数据都为null 这样对应左表的数据全部通过on条件匹配完成之后,就会生成一张临时表,这个临时表中包含的字段就是select的那些字段,值来源于左表和右表 如果LEFT JOIN查询有where...不能匹配上当前这行的右表数据,这行的左表数据就全是null RIGHT JOIN和where使用,与LEFT JOIN基本相同 1.根据on的条件构建临时表,只是这时候临时表的一行数据中,右表的数据必须存在...,左表的数据按照on的条件与当前行的右表数据匹配,匹配上就展示左表数据,匹配不上左表数据就是null。

    1.2K10

    Apache-Flink深度解析-JOIN 算子

    NULL; FULL - 返回左表和右表的并集,不存在一边补NULL; SELF JOIN - 自连接,将表查询时候命名不同的别名。...FULL OUTER JOIN 全外链接语义返回左表和右表的并集,不存在一边补NULL,用于演示的MySQL数据库不支持FULL OUTER JOIN。这里不做演示了。...上图主要关注点是当左边先流入1,2事件时候,右边没有可以join的事件时候会向下游发送左边事件并补NULL向下游发出,当右边第一个相同的Join key到来的时候会将左边先来的事件发出的带有NULL的事件撤回...JOIN key P001进行JOIN的事件)需要撤回左边下发的NULL记录,并下发JOIN完整(带有右边事件列)的事件到下游。...那么这问题如何解决呢? 我们可以改变JOIN的先后顺序,来保证A LEFT JOIN B 不会产生NULL的热点问题,如下: ?

    1.8K30
    领券