当前位置: 首页 > 面试题库 >

PostgreSQL LEFT OUTER JOIN查询语法

郑帅
2023-03-14
问题内容

可以说我有一个table1

  id      name
-------------
  1       "one"
  2       "two"
  3       "three"

table2带有第一个外键的:

id    tbl1_fk    option   value
-------------------------------
 1      1         1        1
 2      2         1        1
 3      1         2        1
 4      3         2        1

现在,我想将其作为查询结果:

table1.id | table1.name | option | value
-------------------------------------
      1       "one"        1       1
      2       "two"        1       1
      3       "three"    
      1       "one"        2       1
      2       "two"    
      3       "three"      2       1

我该如何实现?

我已经尝试过:

SELECT
  table1.id,
  table1.name,
  table2.option,
  table2.value
FROM table1 AS table1
LEFT outer JOIN table2 AS table2 ON table1.id = table2.tbl1fk

但结果似乎忽略了空值:

1    "one"    1   1
2    "two"    1   1
1    "one"    2   1
3    "three"  2   1

求助:感谢Mahmoud Gamal:(加上GROUP BY)用此查询解决了

SELECT 
  t1.id,
  t1.name,
  t2.option,
  t2.value
FROM
(
  SELECT t1.id, t1.name, t2.option
  FROM table1 AS t1
  CROSS JOIN table2 AS t2
) AS t1
LEFT JOIN table2 AS t2  ON t1.id = t2.tbl1fk
                       AND t1.option = t2.option
group by t1.id, t1.name, t2.option, t2.value
ORDER BY t1.id, t1.name

问题答案:

您必须使用CROSS JOIN以获得name第一个表与option第二个表的所有可能组合。然后将LEFT JOIN这些与第二张表组合。就像是:

SELECT 
  t1.id,
  t1.name,
  t2.option,
  t2.value
FROM
(
  SELECT t1.id, t1.name, t2.option
  FROM table1 AS t1
  CROSS JOIN table2 AS t2
) AS t1
LEFT JOIN table2 AS t2  ON t1.id = t2.tbl1_fk
                       AND t1.option = t2.option


 类似资料:
  • Hyperledger Composer中的查询以定制的查询语言编写。查询在业务网络定义中的一个叫(queries.qry)的查询文件中定义。 查询语法 所有查询都必须包含description和statement属性。 描述 该description属性是描述查询功能的字符串。它必须包含但可以包含任何东西。 声明 该statement属性包含查询的定义规则,可以具有以下运算符: SELECT 是

  • 我正在使用JDBC尝试从以下表中选择: 我想检查是否存在具有特定login和PASSWORDMD5值的行,如下所示: 但当我调用时,我会得到以下错误: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:sun.reflect.nativeConstructorAccessorImpl.newInstance(nativeConstr

  • Lucene查询语言 ElasticSearch提供的一些查询方式(query types)能够被Lucene的查询解析器(query parser)语法所支持。由于这个原因,我们来深入学习Lucene查询语言,了解其庐山真面目吧。 基础语法 用户使用Lucene进行查询操作时,输入的查询语句会被分解成一个或者多个Term以及逻辑运算符号。一个Term,在Lucene中可以是一个词,也可以是一个短

  • 问题内容: 我希望能够使用“替换为”语句更新相同架构的表。最后,我需要能够使用可能已更改的值更新大型表。 这是我用来开始的查询: 我不明白的是,数据库引擎如何知道什么是重复行,什么不是?这些数据非常重要,我不能冒险破坏数据。是否简单如“如果列出的所有列都具有相同的值,它就是重复的行”? 我只是想找出一种有效的方法来执行此操作,因此我可以在一分钟内更新> 45,000行。 问题答案: 如文档所述:

  • 问题内容: 我正在尝试按日期对我的讨论区中的帖子进行排序。这是我的代码: 这在语法上有什么问题吗?如果没有,还有什么可能是错误的?基本上发生的是结果没有显示出来。我删除了Order,它可以工作(但当然没有排序…) 问题答案: 订购应超出限制:

  • 问题内容: 当我运行查询时: 我得到错误: 如何正确制定此查询? 我在使用SQL Server 2000 问题答案: 在最后一个括号后添加一个别名。

  • 在扩展查询模式中可以使用如下特殊操作符:  或(OR)操作符: hello | world  非(NOT)操作符: hello -world hello !world  字段(field)搜索符: @title hello @body world  字段限位修饰符(版本Coreseek 3/Sphinx 0.9.9-rc1中引入): @body[50] hello  多字段搜索符: @(

  • 布尔查询允许使用下列特殊操作符: 显式的与(AND)操作符: hello & world 或(OR)操作符: hello | world 非(NOT)操作符: hello -world hello !world 分组(grouping): ( hello world ) 以下是一个使用了如上全部操作符的例子: Example5.布尔查询示例 ( cat -dog ) | ( cat -mouse)