【问题标题】:How to fetch particular record from table X joining table Y or table Z where table Y and Z has same column name with same kind of data?如何从表 X 连接表 Y 或表 Z 中获取特定记录,其中表 Y 和 Z 具有相同的列名和相同类型的数据?
【发布时间】:2013-07-09 16:27:23
【问题描述】:

我有以下查询,我从连接表日志和设备中获取数据,但来自表设备的 b.id 也在另一个名为 device2 的表中,具有相同的列名。所以我必须编写一个查询,如果设备表在该 id 列上有空值或空值,则必须使用表 log 提取表设备 2 上的记录,否则它必须连接表设备和日志。

SELECT TO_CHAR (a.LOG_DATE, 'mm/dd/yyyy HH:MI:SS') LOG_DATE,
b.id,
a.atid,
a.l_type,
a.l_subtype,
a.eq,
a.name,
a.comments
FROM log a, (equipment b or equipment2 b)
WHERE a.eqid = b.eqid(+)
AND log_date BETWEEN TO_DATE ('07/01/2013', 'MM/DD/YYYY')
                      AND  TO_DATE ('07/08/2070', 'MM/DD/YYYY')
GROUP BY a.log_date,
b.id,
a.atid,
a.l_type,
a.l_subtype,
a.eq,
a.name,
a.comments
ORDER BY b.id;

【问题讨论】:

  • 这些表之间是否定义了任何引用?这句话对我来说听起来很奇怪:equipment table has **empty** or null value。另外,为什么有两个“设备”表?它们是否具有相同的结构?
  • 我们的数据库中有两种设备类型。假设当用户提交他们的请求时,他们可以选择类型 1 设备或类型 2。这两种类型的设备数据都来自名为 eqdata 的单个表,其中 id(主键)相同但设备类型不同。所以我们根据设备类型存储数据。如果其设备类型为 1,则转到设备 1 表,否则,如果其设备类型为 2,则转到 equipment2 表。
  • 通过使用 ANSI-92 语法,这些类型的问题变得非常容易避免或解决。

标签: sql oracle join toad


【解决方案1】:

假设子记录总是在设备或设备2中,但绝不同时在两者中,您可以只添加设备2和外连接,并使用 NVL() 选择非空值:

SELECT TO_CHAR (a.LOG_DATE, 'mm/dd/yyyy HH:MI:SS') LOG_DATE,
  nvl(b.id,b2.id),
  a.atid,
  a.l_type,
  a.l_subtype,
  a.eq,
  a.name,
  a.comments
FROM 
  log a, 
  equipment b,
  equipment2 b2
WHERE 
  a.eqid = b.eqid(+)
  AND a.eqid = b2.eqid(+)
  AND log_date BETWEEN TO_DATE ('07/01/2013', 'MM/DD/YYYY')
                  AND  TO_DATE ('07/08/2070', 'MM/DD/YYYY')
ORDER BY 2

这还假设您只选择不会填充 NULL 的列。例如,如果设备/设备 2 还包含一个可能为空的“名称”列,则需要一些额外的逻辑:

case when b.id is null then b2.name else b.name end

【讨论】:

    【解决方案2】:

    另一种可能性是合并两个设备表并加入它。假设设备和设备2 中的表结构相同,否则您当然需要选择特定字段。否则……

     SELECT *
     INTO #equipTemp
     FROM equipment WHERE ID IS NOT NULL
     UNION ALL
     SELECT * FROM equipment2 WHERE ID IS NOT NULL
    
    SELECT TO_CHAR (a.LOG_DATE, 'mm/dd/yyyy HH:MI:SS') LOG_DATE,
     b.id,
     a.atid,
     a.l_type,
     a.l_subtype,
     a.eq,
     a.name,
     a.comments
     FROM log a, #eqipTemp b
     WHERE a.eqid = b.eqid(+)
     AND log_date BETWEEN TO_DATE ('07/01/2013', 'MM/DD/YYYY')
                      AND  TO_DATE ('07/08/2070', 'MM/DD/YYYY')
     GROPU BY...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      相关资源
      最近更新 更多