Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
1

Коррелированный подзапрос

22.07.2014, 12:52. Просмотров 1643. Ответов 21
Метки нет (Все метки)

Здравствуйте! Пытаюсь соединить две таблицы следующим образом:

SQL
1
2
3
4
5
6
SELECT *
FROM t1 JOIN t2
ON t1.IP = t2.IP
WHERE t1.ID = (SELECT MAX(ID)
                      FROM TABLE_NAME                       
                      WHERE t1.IP = IP AND t1.FILE_NAME = FILE_NAME);
В первой таблице (t1) есть записи, в которых у двух и более кортжей могут быть одинаковые пары полей (IP, FILE_NAME). Например, из кортежей ('IP1', 'FILE_NAME1', 1) и ('IP1', 'FILE_NAME1', 2) должен быть выбран второй, так как его ID больше (2). Проблема в том, что некоторые кортежи теряются, хотя должны выводиться. Подскажите, в чем ошибка и как ее исправить? Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 12:52
Ответы с готовыми решениями:

подзапрос
1)Определить наименование и вид обуви, имеющей наибольшую стоимость. Select...

3 столбца и подзапрос
Запрос выводит минимальную цену продуктов, которые содержатся в сырниках. Нужно...

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

Подзапрос с агрегированной функцией в FROM
Есть такой код, который правильно подсчитывает количество звонков с каждым...

Как написать ПОДЗАПРОС ?
Я вот написал запрос, но не могу сделать через Подзапрос, помогите плизз! ...

21
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
22.07.2014, 12:58 2
Цитата Сообщение от RocBoy-D Посмотреть сообщение
Проблема в том, что некоторые кортежи теряются, хотя должны выводиться.
Почему вы решили, что они должны выводиться?
0
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 13:04  [ТС] 3
invm, есть контрольная таблица с которой можно свериться. Вобще это часть более сложного запроса, думаю ошибка именно в этом месте.
0
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
22.07.2014, 13:08 4
А что за TABLE_NAME в подзапросе?
0
iap
900 / 625 / 130
Регистрация: 27.11.2009
Сообщений: 1,867
22.07.2014, 13:34 5
T-SQL
1
2
3
SELECT TOP(1) WITH TIES *
FROM t1 JOIN t2 ON t1.IP = t2.IP
ORDER BY ROW_NUMBER()OVER(PARTITION BY t1.IP,t1.FILE_NAME ORDER BY t1.ID DESC);
Или пронумеровать вот этим ROW_NUMBERом и оставить с номером, равным 1
1
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 14:10  [ТС] 6
invm, table_name - это название таблицы t1. Я решил, что ошибка именно в этом месте, потому что если его закомментировать, то выводится верное количество записей. На данный момент в первой таблице нет повторяющихся пар (IP, FILE_NAME), то есть каждая запись и так в единственном экземпляре и выбирать максимальное ID не нужно. Но почему-то некоторые записи из нужных отбрасываются, если добавить вот эту выборку максимального ID
0
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
22.07.2014, 14:20 7
RocBoy-D, покажите реальный запрос.
0
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 14:37  [ТС] 8
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
SELECT RANGENAME, DATAPATH, CDR_SOURCE, FILE_SIZE, FILE_CREATION_DATE, MODIFIED_DATE, PROCESS_DATE, SEQUENCE, PARSED_COUNT, REJECTED_COUNT, ERRONEOUS_COUNT, IGNORED_COUNT, SUCCESS_COUNT, ID, PROCESS_TYPE
FROM cdr_source_statistics AS css JOIN gateways AS g
ON css.IP = g.STARTIP
WHERE g.rangename = 'A%'
AND css.PROCESS_TYPE <> 'R'
AND css.PROCESS_DATE <> TO_DATE ('01.01.1970', 'dd.mm.yyyy')
AND css.FILE_CREATION_DATE >= TO_DATE ('01.06.2014 00:00:00', 'dd.mm.yyyy hh24:mi:ss') AND css.FILE_CREATION_DATE <= TO_DATE ('30.06.2014 23:59:59', 'dd.mm.yyyy hh24:mi:ss')
AND css.ID = (SELECT MAX(ID)
                   FROM cdr_source_statistics
                   WHERE css.IP = cdr_source_statistics.IP AND css.CDR_SOURCE = cdr_source_statistics.CDR_SOURCE);
Добавлено через 10 минут
Попробовал сделать просто выборку необходимых кортежей из первой таблицы без соединения со второй - тот же результат (некоторые записи не выводятся)
0
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
22.07.2014, 14:45 9
Э... Запрос-то у вас не к MSSQL.
Как проверяли, что проблема в коррелированном подзапросе, а не в остальных фильтрах?
0
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 14:53  [ТС] 10
invm, закомментировал последние три строки этого запроса - выдало правильный результат. Вместе с подзапросом - ответ неверный. Если убрать остальные фильтры, тогда ответ не удовлетворяет условиям
0
iap
900 / 625 / 130
Регистрация: 27.11.2009
Сообщений: 1,867
22.07.2014, 15:12 11
Цитата Сообщение от RocBoy-D Посмотреть сообщение
invm, закомментировал последние три строки этого запроса - выдало правильный результат. Вместе с подзапросом - ответ неверный. Если убрать остальные фильтры, тогда ответ не удовлетворяет условиям
Это Oracle такой, сынок!
0
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 15:14  [ТС] 12
iap, не понял? проблема не в запросе?
0
iap
900 / 625 / 130
Регистрация: 27.11.2009
Сообщений: 1,867
22.07.2014, 15:17 13
Цитата Сообщение от RocBoy-D Посмотреть сообщение
iap, не понял? проблема не в запросе?
Странно спрашивать на форуме по MSSQL про запрос для Oracle.
Тут же для этого специальный форум есть.

Об этом ясно говорит функция TO_DATE()
0
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 15:21  [ТС] 14
iap, в моем первом запросе код на простом SQL. Это по ходу темы я выложил запрос из Oracle
0
iap
900 / 625 / 130
Регистрация: 27.11.2009
Сообщений: 1,867
22.07.2014, 15:25 15
Цитата Сообщение от RocBoy-D Посмотреть сообщение
iap, в моем первом запросе код на простом SQL. Это по ходу темы я выложил запрос из Oracle
А разве в моём первом запросе не содержится ответ?
Правда, TOP(1) WITH TIES в Oracle нет.
Но пронумеровать в CTE ROW_NUMBERом и оставить с первыми номерами Вы же можете?
Есть и другие решения, но нельзя же ожидать от меня их все?!
0
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 15:55  [ТС] 16
Похоже ошибка была вот в чем: запись с максимальным полем ID могла не удовлетворять одному из вышезаданных условий и поэтому не входит в результирующий набор. Вариант с TOP(1) вроде работает. Можно как-то по-другому поступить в этом случае?
0
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
22.07.2014, 16:09 17
Цитата Сообщение от RocBoy-D Посмотреть сообщение
Можно как-то по-другому поступить в этом случае?
Вам нужен запрос, работающий и на MSSQL и на Oracle?
0
RocBoy-D
40 / 39 / 23
Регистрация: 10.03.2012
Сообщений: 374
22.07.2014, 16:22  [ТС] 18
invm, мне не обязательно писать готовый запрос. Можете просто подсказать алгоритм

Добавлено через 1 минуту
а вобще пишу на Oracle, но так как ветка sql server...
0
iap
900 / 625 / 130
Регистрация: 27.11.2009
Сообщений: 1,867
22.07.2014, 16:26 19
Цитата Сообщение от RocBoy-D Посмотреть сообщение
а вобще пишу на Oracle, но так как ветка sql server...
Придётся в явном виде написать...
Вот так работает?
Oracle 11 SQL
1
2
3
4
5
6
WITH CTE AS
(
 SELECT ROW_NUMBER()OVER(PARTITION BY t1.IP,t1.FILE_NAME ORDER BY t1.ID DESC) AS N,*
 FROM t1 JOIN t2 ON t1.IP = t2.IP
)
SELECT * FROM CTE WHERE N=1;
1
invm
1932 / 1307 / 397
Регистрация: 02.06.2013
Сообщений: 3,314
22.07.2014, 16:28 20
Цитата Сообщение от RocBoy-D Посмотреть сообщение
Можете просто подсказать алгоритм
T-SQL
1
2
3
4
5
6
7
8
9
10
with x as
(
 Ваш запрос, без коррелированного подзапроса, с добавлением столбца row_number() over (...) as rn
)
select
 список столбцов
from
 x
where
 rn = 1;
Цитата Сообщение от RocBoy-D Посмотреть сообщение
а вобще пишу на Oracle, но так как ветка sql server...
Вам не кажется странным искать ответы для Oracle в ветке по MSSQL?
1
22.07.2014, 16:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 16:28

Подзапрос в инструкции update
есть таблица baza.dbo.fmostarx2, надо в ней сделать update тех строк где поле...

Подзапрос - минимум от запроса
У меня есть запрос который возвращает три строки (Препарат,цена,аптека) и мне...

Видимость with-подзапрос; NULL
Здравствуйте, 1) а почему здесь with G as (select SUM (x) from table)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru