Исходя из того, что вы сказали в комментариях, вы слишком усложняете вещи; Вы можете получить желаемый результат, просто изменив внутренний запрос из вашего CTE:
SELECT o.id,
o.VALUE_NUMBER,
i.VALUE_STRING,
MIN (TRIM (
v.VALUE_STRING
|| ' '
|| v.VALUE_NUMBER
|| ' '
|| x.VALUE_STRING
|| ' '
|| c.VALUE_STRING)
) OVER (PARTITION BY o.VALUE_NUMBER,
i.VALUE_STRING)
AS INFO
FROM IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION i ON o.parent = i.parent
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION v
ON i.parent = v.parent
AND v.KEY = 'truck1'
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION x
ON i.parent = x.parent
AND x.KEY = 'item_name'
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION c
ON x.parent = c.parent
AND c.KEY = 'truck2'
WHERE i.key = 'reader'
AND i.VALUE_STRING =
'aedef9f9-2e82-11ea-80cb-e03f49835a25'
AND o.key = 'transaction'
AND o.value_number <> 0
AND TRIM (
v.VALUE_STRING
|| ' '
|| v.VALUE_NUMBER
|| ' '
|| x.VALUE_STRING
|| ' '
|| c.VALUE_STRING)
IS NOT NULL
, который получит:
ID | VALUE_NUMBER | VALUE_STRING | INFO
------: | :------------ | :----------------------------------- | :----------------
4680828 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 95888137 MY_IDENT
4680704 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 95888137 MY_IDENT
Обновлено db <> fiddle
Даже это может быть сложнее, чем необходимо, но трудно сказать. И могут быть причины, по которым CTE и окончательное внешнее соединение возвращаются к одной и той же таблице, но если это так, то они не были объяснены, и в данный момент они просто вводят дополнительные строки, которые, как вы говорите, вам не нужны.
В данный момент ваш txn
CTE получает в основном те же данные, что и выше:
...
select * from txn;
TRANSACTION_VALUE_NUMBER | READER_VALUE_STRING | ID | INFO
:----------------------- | :----------------------------------- | ------: | :----------------
1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 4680828 | MY_IDENT
1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 4680704 | 95888137 MY_IDENT
Затем вы просматриваете все строки transaction
из базовой таблицы с помощью этого value_number
, где он находит «лишний» идентификатор, который вы не ожидаете:
select * from IOT_STREAM_ANALYTICS_LOG_REPRESENTATION where value_number = 1578109515974
ID | VALUE_NUMBER | VALUE_STRING | KEY | PARENT
------: | :------------ | :----------- | :---------- | :-----
4680704 | 1578109515974 | null | transaction | 527241
4680828 | 1578109515974 | null | transaction | 527323
4680123 | 1578109515974 | null | transaction | 527322
, а затем вы смешиваете данные из этих строк с данными из txn
, чтобы получить ваш запутанный результат.
Вы все еще можете использовать это, чтобы присоединиться к другим таблицам; возможно, что-то вроде этого:
WITH txn AS (
SELECT o.id,
o.VALUE_NUMBER,
i.VALUE_STRING,
MIN (TRIM (
v.VALUE_STRING
|| ' '
|| v.VALUE_NUMBER
|| ' '
|| x.VALUE_STRING
|| ' '
|| c.VALUE_STRING)
) OVER (PARTITION BY o.VALUE_NUMBER,
i.VALUE_STRING)
AS INFO
FROM IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION i ON o.parent = i.parent
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION v
ON i.parent = v.parent
AND v.KEY = 'truck1'
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION x
ON i.parent = x.parent
AND x.KEY = 'item_name'
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION c
ON x.parent = c.parent
AND c.KEY = 'truck2'
WHERE i.key = 'reader'
AND i.VALUE_STRING =
'aedef9f9-2e82-11ea-80cb-e03f49835a25'
AND o.key = 'transaction'
AND o.value_number <> 0
AND TRIM (
v.VALUE_STRING
|| ' '
|| v.VALUE_NUMBER
|| ' '
|| x.VALUE_STRING
|| ' '
|| c.VALUE_STRING)
IS NOT NULL
)
SELECT txn.id,
txn.VALUE_NUMBER,
txn.VALUE_STRING,
txn.parent,
txn.INFO,
evlog.id logid,
evlog.cr_date,
evlog.device_name device,
to_char(date '1970-01-01' + rep.value_number/86400000, 'yyyy.mm.dd hh24:mi:ss') ||' '|| nvl(trns.representation, '') transaction_number,
ev.deveventid event_id,
nvl(evlog.description, ev.name) event_name,
evlog.organization_name organization,
'<img src="#IMAGE_PREFIX#app_ui/img/icons/apex-edit-view.png" class="apex-edit-view standalone-link" alt="Edit"><span class="photos-count"></span>' photos
FROM txn
LEFT JOIN IOT_STREAM_ANALYTICS_EVENT_LOG evlog
ON txn.parent = evlog.id
LEFT JOIN IOT_DEVICE_EVENT ev
ON evlog.device_event = ev.id
LEFT JOIN IOT_STREAM_ANALYTICS_TRANSACTIONS trns
ON txn.value_number = trns.name
order by evlog.cr_date desc
Полностью не проверено, конечно ...