0

我有以下查询,我从连接表日志和设备中获取数据,但来自表设备的 b.id 也在另一个名为设备 2 的表中,具有相同的列名。所以我必须编写一个查询,如果设备表在该 id 列上有空值或空值,则必须提取表设备 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;
4

2 回答 2

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
于 2013-07-09T19:18:04.357 回答
0

另一种可能性是合并两个设备表并加入它。假设设备和设备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...
于 2013-07-09T19:56:44.260 回答