oracle-запрос для проверки строк с одинаковым идентификатором и заданным полем одинаковы - PullRequest
0 голосов
/ 12 октября 2018

Так что мне нужен запрос, который будет выполняться в Oracle, который даст мне все идентификаторы для строк, в которых данное поле имеет одинаковое значение в каждой строке с этим идентификатором, и нет строк с таким идентификатором, которые не совпадаютзначение в данном поле.

Так что если у меня есть таблица, подобная этой, и я ищу значение X в FieldB:

ID     FieldA     FieldB     FieldC
1      A          X          D
2      B          X          E
2      C          Y          F
1      D          X          G
3      E          X          H
3      F          Z          I
1      G          X          J
1      H          X          K
1      I          X          L

Я хочу что-то, что даст мне идентификаторТолько 1, потому что каждая строка для этого идентификатора имеет X в FieldB и нет строк для идентификатора 1, которые не имеют X в FieldB.Я попробовал следующий запрос:

SELECT 
        a.ID
    from 
        tablename a
    where
        exists (select 1 from tablename where ID = a.ID and FieldB = 'X')
        and not exists (select 1 from tablename where ID = a.ID and (FieldB != 'X' or FieldB is null))

Но я продолжаю получать сообщение об ошибке:

ORA-01652: unable to extend temp segment by 128 in tablespace TEMP_TS2
01652. 00000 -  "unable to extend temp segment by %s in tablespace %s"
*Cause:    Failed to allocate an extent of the required number of blocks for
           a temporary segment in the tablespace indicated.

, которое, как я предполагаю, означает, что мой запрос ужасно неэффективен (или просто неверен).Я думаю, что есть простой способ сделать это, но я не нашел его.Есть мысли?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

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

select a.ID
from tablename a
where a.FieldB = 'X'
group by a.ID
having count(distinct FieldB) = 1;
0 голосов
/ 12 октября 2018

Вы можете использовать агрегацию и having:

select id
from t
group by id
having min(fieldB) = max(fieldB) and -- all the same
       min(fieldB) = 'X';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...