Форум программистов, компьютерный форум, киберфорум
Наши страницы

Microsoft SQL Server

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
RocBoy-D
40 / 39 / 10
Регистрация: 10.03.2012
Сообщений: 373
#1

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

22.07.2014, 12:52. Просмотров 1459. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Коррелированный подзапрос (SQL Server):

подзапрос - SQL Server
1)Определить наименование и вид обуви, имеющей наибольшую стоимость. Select max(*) From асортимент Group by наименование обуви,...

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

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

Подзапрос с агрегированной функцией в FROM - SQL Server
Есть такой код, который правильно подсчитывает количество звонков с каждым городом SELECT Cities.Город, COUNT(Calls.) AS FROM...

Как написать ПОДЗАПРОС ? - SQL Server
Я вот написал запрос, но не могу сделать через Подзапрос, помогите плизз! /*1. Список преподавателей, ведущих дисциплины «Английский...

Подзапрос в инструкции update - SQL Server
есть таблица baza.dbo.fmostarx2, надо в ней сделать update тех строк где поле cv=0 пишу так: update baza.dbo.fmostarx2 set cv=b.cw...

21
invm
1810 / 1220 / 344
Регистрация: 02.06.2013
Сообщений: 3,056
22.07.2014, 12:58 #2
Цитата Сообщение от RocBoy-D Посмотреть сообщение
Проблема в том, что некоторые кортежи теряются, хотя должны выводиться.
Почему вы решили, что они должны выводиться?
0
RocBoy-D
40 / 39 / 10
Регистрация: 10.03.2012
Сообщений: 373
22.07.2014, 13:04  [ТС] #3
invm, есть контрольная таблица с которой можно свериться. Вобще это часть более сложного запроса, думаю ошибка именно в этом месте.
0
invm
1810 / 1220 / 344
Регистрация: 02.06.2013
Сообщений: 3,056
22.07.2014, 13:08 #4
А что за TABLE_NAME в подзапросе?
0
iap
802 / 612 / 123
Регистрация: 27.11.2009
Сообщений: 1,815
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 / 10
Регистрация: 10.03.2012
Сообщений: 373
22.07.2014, 14:10  [ТС] #6
invm, table_name - это название таблицы t1. Я решил, что ошибка именно в этом месте, потому что если его закомментировать, то выводится верное количество записей. На данный момент в первой таблице нет повторяющихся пар (IP, FILE_NAME), то есть каждая запись и так в единственном экземпляре и выбирать максимальное ID не нужно. Но почему-то некоторые записи из нужных отбрасываются, если добавить вот эту выборку максимального ID
0
invm
1810 / 1220 / 344
Регистрация: 02.06.2013
Сообщений: 3,056
22.07.2014, 14:20 #7
RocBoy-D, покажите реальный запрос.
0
RocBoy-D
40 / 39 / 10
Регистрация: 10.03.2012
Сообщений: 373
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
1810 / 1220 / 344
Регистрация: 02.06.2013
Сообщений: 3,056
22.07.2014, 14:45 #9
Э... Запрос-то у вас не к MSSQL.
Как проверяли, что проблема в коррелированном подзапросе, а не в остальных фильтрах?
0
RocBoy-D
40 / 39 / 10
Регистрация: 10.03.2012
Сообщений: 373
22.07.2014, 14:53  [ТС] #10
invm, закомментировал последние три строки этого запроса - выдало правильный результат. Вместе с подзапросом - ответ неверный. Если убрать остальные фильтры, тогда ответ не удовлетворяет условиям
0
iap
802 / 612 / 123
Регистрация: 27.11.2009
Сообщений: 1,815
22.07.2014, 15:12 #11
Цитата Сообщение от RocBoy-D Посмотреть сообщение
invm, закомментировал последние три строки этого запроса - выдало правильный результат. Вместе с подзапросом - ответ неверный. Если убрать остальные фильтры, тогда ответ не удовлетворяет условиям
Это Oracle такой, сынок!
0
RocBoy-D
40 / 39 / 10
Регистрация: 10.03.2012
Сообщений: 373
22.07.2014, 15:14  [ТС] #12
iap, не понял? проблема не в запросе?
0
iap
802 / 612 / 123
Регистрация: 27.11.2009
Сообщений: 1,815
22.07.2014, 15:17 #13
Цитата Сообщение от RocBoy-D Посмотреть сообщение
iap, не понял? проблема не в запросе?
Странно спрашивать на форуме по MSSQL про запрос для Oracle.
Тут же для этого специальный форум есть.

Об этом ясно говорит функция TO_DATE()
0
RocBoy-D
40 / 39 / 10
Регистрация: 10.03.2012
Сообщений: 373
22.07.2014, 15:21  [ТС] #14
iap, в моем первом запросе код на простом SQL. Это по ходу темы я выложил запрос из Oracle
0
iap
802 / 612 / 123
Регистрация: 27.11.2009
Сообщений: 1,815
22.07.2014, 15:25 #15
Цитата Сообщение от RocBoy-D Посмотреть сообщение
iap, в моем первом запросе код на простом SQL. Это по ходу темы я выложил запрос из Oracle
А разве в моём первом запросе не содержится ответ?
Правда, TOP(1) WITH TIES в Oracle нет.
Но пронумеровать в CTE ROW_NUMBERом и оставить с первыми номерами Вы же можете?
Есть и другие решения, но нельзя же ожидать от меня их все?!
0
22.07.2014, 15:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 15:25
Привет! Вот еще темы с ответами:

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

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

Некорректно работает соотнесенный подзапрос - SQL Server
Здравствуйте. У меня проблемы с соотнесенным подзапросом. Например: SELECT *from Car a WHERE price&gt;(SELECT avg(price) from Car ...

Как создать подзапрос, возвращающий список значений через запятую - SQL Server
Добрый день, коллеги Есть 2 таблицы: студенты (Stud) IdStud int, NameStud char(20) и их оценки (Mark): IdStud int, MarkStud tinyint ...


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

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

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