0

テーブルログと機器を結合してデータを取得している以下のクエリがありますが、テーブル機器から出てくるb.idは同じ列名の機器2という別のテーブルにもあります。そのため、機器テーブルの id 列に空または null 値がある場合、テーブル機器 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() を使用して null 以外の値を選択することができます。

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 が入力されない列のみを選択していることも前提としています。たとえば、equipment/equipment2 に null の可能性がある "name" 列も含まれている場合は、追加のロジックが必要になります。

case when b.id is null then b2.name else b.name end
于 2013-07-09T19:18:04.357 に答える