SQL:联接两个表-结果表应列出所有ID即使不是联接表中的ID

问题描述

我有两个桌子。

第一个表称为“类型”,如下所示:

onClick={console.log}

第二个表称为“ TypeParam”:

TypeID  |  Name
1       |  Test1
2       |  Test2
3       |  Test3
4       |  Test4

我要实现的目的是(左?)同时连接两个表。结果应该 列出具有相关形状的所有类型。如果TypeParam表中没有形状参数列表,则结果表中的值应为NULL。如果有 TypeParam表中未列出的其他TypeID条目 类型表,结果表不应包含它们。

结果表应如下所示:

TypeID  |  ParamName  |  ParamValue
1       |  heading    |  0.349
1       |  motion     |  1
1       |  shape      |  F
1       |  slumber    |  0|0
3       |  motion     |  2
3       |  shape      |  B
4       |  shape      |  B
5       |  shape      |  F

到目前为止,我一直在尝试的SQL语句已经列出了alle类型,并带有 相关的形状。但是没有列出在TypeParam表中没有形状条目的类型。我该如何实现?我想要结果表中缺少的条目(TypeID = 2,shape = null)。在TypeParam表中TypeID = 5的条目不能在结果表中列出,因为它不在Type表中列出。

TypeID  |  Name    |  Shape
1       |  Test1   |  F
2       |  Test2   |  null
3       |  Test3   |  B
4       |  Test4   |  B

有什么建议吗?

解决方法

将您的TypeParam.ParamName = 'shape'条件移动到ON Cluase

SELECT Type.TypeID AS TypeID,Type.Name AS Name,TypeParam.ParamValue AS Shape 
FROM Type LEFT JOIN TypeParam ON TypeParam.TypeID = Type.TypeID
and TypeParam.ParamName = 'shape' 
,

正如@GarethD在评论中指出的那样,我正在使用MS-Access,因此使用子查询解决了该问题。使用LEFT JOIN (SELECT TypeID,ParamValue FROM TypeParam WHERE ParamName = 'shape') AS tp ON tp.TypeID = Type.TypeID解决了这个问题。 谢谢!

,

在MS Access中,最简单的解决方案可能是相关子查询:

SELECT t.*,(SELECT tp.ParamValue
        FROM TypeParam as tp
        WHERE tp.TypeID = t.TypeID AND tp.ParamName = "shape"
       ) as Shape 
FROM Type as t;

注意:如果给定的TypeId有多个“形状”,则将报告错误。如果有可能,我建议您问一个 new 问题,并提供适当的示例数据并说明您想做什么。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...