Как получить записи из БД, которые соответствуют определенным критериям - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть следующая проблема, и я хотел спросить, является ли это правильным способом или есть лучший способ сделать это:

Предположим, у меня есть следующая таблица / данные в моей БД:

|---|----|------|-------------|---------|---------|
|id |city|street|street_number|lastname |firstname|
|---|----|------|-------------|---------|---------|
| 1 | ar | K1   |    13       |Davenport| Hector  |
| 2 | ar | L1   |    27       |Cannon   | Teresa  |
| 3 | ar | A1   |    135      |Brewer   | Izaac   |
| 4 | dc | A2   |    8        |Fowler   | Milan   |
| 5 | fr | C1   |    18       |Kaiser   | Ibrar   |
| 6 | fr | C1   |    28       |Weaver   | Kiri    |
| 7 | ny | O1   |    37       |Petersen | Derrick |

Теперь я получаю некоторые запросы следующих структур: (city / street / street_number)

Например: {(ar,K1,13),(dc,A2,8),(ny,01,37)}

Я хочу получить последние имя человека, живущего там. Поскольку сумма запроса довольно велика, я не хочу, чтобы все запросы обрабатывались один за другим. Моя текущая реализация - вставить данные во временную таблицу и объединить значения.

Это правильный подход или есть какой-то лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Я думаю, что вы можете использовать иерархический запрос и строковую функцию следующим образом:

WITH YOUR_INPUT_DATA AS
(SELECT '(ar,K1,13),(dc,A2,8),(ny,01,37)' AS INPUT_STR FROM DUAL),
--
CTE AS
( SELECT REGEXP_SUBSTR(STR,'[^,]',1,2) AS STR1, 
         REGEXP_SUBSTR(STR,'[^,]',1,3) AS STR2, 
         REGEXP_SUBSTR(STR,'[^,]',1,4) AS STR3
   FROM  (SELECT SUBSTR(INPUT_STR, 
              INSTR(INPUT_STR,'(',1,LEVEL), 
              INSTR(INPUT_STR,')',1,LEVEL) - INSTR(INPUT_STR,'(',1,LEVEL) + 1) STR
  FROM YOUR_INPUT_DATA
CONNECT BY LEVEL <= REGEXP_COUNT(INPUT_STR,'\),\(') + 1))
--
SELECT * FROM YOUR_TABLE WHERE (city,street,street_number)
IN (SELECT STR1,STR2,STR3 FROM CTE);
0 голосов
/ 08 апреля 2020

Вы можете построить запрос, используя in с кортежами:

select t.*
from t
where (city, street, street_number) in ( (('ar', 'K1', '13'), ('dc', 'A2', '8'), ('ny', '01', '37') );

Однако, если данные начинаются в базе данных, тогда временная таблица или подзапрос лучше, чем возвращать результаты в приложение. и построение такого запроса.

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