【问题标题】:How to join records from multiple object tables to a master table with a single query?如何使用单个查询将多个对象表中的记录连接到主表?
【发布时间】:2013-07-24 16:48:44
【问题描述】:

所以我有一个数据模型,它设置有一个表,其中包含一系列对象的NAMEIDCONDITION 列(每个对象都有一个唯一的 ID 号)。这些对象的其余属性包含在基于对象类型的几个相应表的列中(每种类型都有一些不同的属性)。所有特定类型的表都有一个ID 列,以便可以将对象匹配到主列表。

我想编写一个 sql 查询,该查询将根据与它们唯一的 ID 相关联的 CONDITION 返回有关几种不同类型对象的信息。

这是我正在使用的简化示例:

object_master_list
| ID | NAME | CONDITION |
-------------------------
|1234|  obj1|       true|
|0000|  obj2|      false|
|1236|  obj3|       true|
|0001|  obj4|      false|
|5832|  obj5|       true|
|6698|  obj6|      false|
|6699|  obj7|      false|


obj_type_one
| ID | NAME |   HEIGHT   |
-------------------------
|1234|  obj1|    o1height|
|0000|  obj2|    o2height|
|5832|  obj5|    o5height|
|6699|  obj7|    o7height|


obj_type_two
| ID | NAME |   WEIGHT   |
-------------------------
|1236|  obj3|    o3height|
|0001|  obj4|    o4height|
|6698|  obj6|    o6height|

如您所见,NAME 和 type 或 ID 和 type 之间没有关联。 我目前在 iReport 工作,我一直在使用查询设计器并根据需要手动编辑它。

现在示例查询如下所示:

SELECT 
    object_master_list."NAME" AS NAME,
    obj_type_one."HEIGHT" AS HEIGHT,
    obj_type_two."WEIGHT" AS WEIGHT
FROM
    object_master_list INNER JOIN obj_type_one ON object_master_list."ID" =    
obj_type_one."ID"
    INNER JOIN obj_type_two ON obj_type_two."ID" = object_master_list."ID"
WHERE
    object_master_list."CONDITION" = 'true'

我的数据没有返回任何结果。根据我对 sql join 所做的研究,我相信这正在发生:

圆圈“A”代表我的主列表。

iReport 逐行存储和利用从查询返回的值,每列都有一个字段。所以理想情况下我应该这样结束:

$F{NAME} which will receive the following values in succession ("obj1", "obj3", "obj5") 
$F{HEIGHT}  with value series (o1hieght, null, o5height)
$F{HEIGHT} with value series (null, o3weight, null)

我想表格表示应该是这样的:

| NAME |  HEIGHT  |  WEIGHT  |
------------------------------
|  obj1|  o1height|      null|
|  obj3|      null|  o3weight|
|  obj5|  o5height|      null|

我的问题是如何做到这一点?

我以前在较小的范围内遇到过这个问题,所以我知道我可以使用子报表或创建多个数据集,但坦率地说,我有很多对象类型,如果我能提供帮助,我宁愿不这样做。我也不允许在主列表中添加TYPE 列。

提前感谢您的任何回复。

【问题讨论】:

  • 您能否根据您的示例表显示预期结果?
  • 是的,好点。我将编辑我的问题。

标签: sql jasper-reports inner-join multiple-tables


【解决方案1】:

您可以通过以下方式使用left join

select o1.name, o2.height, o3.weight
from object_master_list o1 left join obj_type_one o2 on o1.id = o2.id 
                           left join obj_type_two o3 on o1.id = o3.id
where o1.condition = 'true'

SQL Fiddle

【讨论】:

  • 这不会导致主列表中的条目重复吗?
  • @GrishaWeintraub 感谢您的链接。我也用你的链接尝试了一些东西,我认为双左连接可能不适合 San 想要的?例如,如果主表的iD从1到10,表一的ID是1-4,表二的ID是6-9,那么双左连接的结果将包括1-10,我认为这与Sam的不同想要哪个是 1-4 和 6-9(没有 5 和 10)?
  • @J.DoG 在这种情况下,身高和体重都将为空值,如果您不希望它们出现在结果中,您可以通过在 where 子句中添加以下内容来轻松过滤掉它们: “而不是(高度为空,重量为空)”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多