выбор значения в sql запрос не работает - PullRequest
0 голосов
/ 23 января 2020

У меня есть демонстрационная версия моего скрипта .

В запросе я указываю, что ищу идентификатор, где i.VALUE_STRING = 'aedef9f9-2e82-11ea-80cb-e03f49835a25', но он отвечает, показывает идентификатор и не только мои условия, а также дополнительные идентификаторы, я получаю идентификатор, где i.VALUE_STRING = 'aedef9f9-2e82-11ea-80cb-e03f49835a26e03f49835a26.

Что я делаю не так?

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

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Исходя из того, что вы сказали в комментариях, вы слишком усложняете вещи; Вы можете получить желаемый результат, просто изменив внутренний запрос из вашего 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

Полностью не проверено, конечно ...

0 голосов
/ 24 января 2020

Возможно, это не полный ответ, но может упростить ситуацию. Simple Pivot возвращает желаемый результат:

select tr_id, tr_vn, rd_vs, t1_vn, it_vs 
  from iot_stream s
  pivot (max(id) id, max(value_number) vn, max(value_string) vs 
         for key in ('transaction' tr, 'reader' rd, 'truck1' t1, 'item_name' it))

, но в одном случае он пропускает номер грузовика, поэтому, если вы хотите взять его из другого ряда с таким же значением считывателя, используйте:

nvl(t1_vn, max(t1_vn) over (partition by rd_vs)) t1_vn

dbfiddle

Я несколько сократил имя таблицы, моя версия Oracle ограничена 30 символами, но в dbfiddle я использовал полное имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...