Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Имеем:
Таблица А, на которую ссылаются данные из Таблицы Б

Например, в таблице Б две записи, которые ссылаются на А.
Как выбрать актуальные данные из таблицы Б ?

Т.е.:
select * from tableB as b inner join table A as a on b.rfTableAID = a.ID

Получим соответственно 2 записи в результате выборки.

В таблице Б есть поле [Дата] как получить Одну актуальную запись в соответствии с этой датой, т.е. можно сказать, что первая запись неактуальна "устаревшая" и она нам не нужна.

Если же задать условие - диапазон, то соответствующим условием выбрать актуальную запись в данном диапазоне, просто добавиться условие where date between...

Но необходимо получить выборку - представление view, которая бы выдавала одну запись.
То есть запрос типа:
select max(date) from tableB as b inner join table A as a on b.rfTableAID = a.ID
group by b.rfTableAID

Не подходит.

Для простоты ограничился двумя записями, на самом деле их там тысячи...

Надеюсь внятно описал ситуацию...
16 окт 12, 17:49    [13328657]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
п.6 тут
16 окт 12, 17:51    [13328671]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Создаем и заполняем две таблицы

create table A(id int, name varchar(50))
insert into A(id, name) 
values(1, 'Тест')

create table B(id int, name varchar(50), dateB datetime, rf_A_ID int)
insert into B(id, name, dateB, rf_A_ID)
values(1, 'Индикатор1', '01-01-2000', 1)
insert into B(id, name, dateB, rf_A_ID)
values(2, 'Индикатор2', '01-01-2010', 1)


Выборка данных:
select * from B as b inner join A as a on b.rf_A_ID = a.id


так не подходит, т.к. нужно получить целую запись целую строку, своего рода view (представление)
select MAX(b.dateB) from B as b inner join A as a on b.rf_A_ID = a.id
group by rf_A_ID


Подскажите пожалуйста как получить вторую запись по дате?
16 окт 12, 18:00    [13328763]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
актуальная - имеющая максимальную дату меньше текущей ?
16 окт 12, 18:15    [13328890]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Имеющая максимальную дату в поле DateB, но, конечно, не больше текущей.
16 окт 12, 18:18    [13328908]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select a.*, x.*
from A a
 inner join (
    select 
       b.*
      ,N = ROW_NUMBER()over (PARTITION BY b.rf_A_ID order by b.dateB desc) 
    from B b
 ) x on x.rf_A_ID = a.id
where x.N = 1 
16 окт 12, 18:22    [13328929]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Спасибо большое!

Но опять же вопрос вдогонку, как данный запрос отработает если в таблице B 1) десятки тысяч записей 2) сотни тысяч записей 3) миллион ?
16 окт 12, 18:29    [13328971]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
До сих пор удивляюсь, какая красота... Вообще Здорово!!!
Спасибо Вам Огромное!!! :)
16 окт 12, 18:32    [13328990]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
при указанной структуре решения вообще нет.
красивое огромноспасибочное решение может каждый раз возвращать разные наборы данных
т.е. оно-то правильное, а структура - нет )
16 окт 12, 18:46    [13329071]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Можно поподробнее?
То есть неправильное решение?
Какое будет верным?
16 окт 12, 18:48    [13329077]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Или какая должна быть структура чтоб решение появилось и какое?
16 окт 12, 18:53    [13329093]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Алексей Кр
Или какая должна быть структура чтоб решение появилось и какое?

такая, при которой возможно выбрать максимум одну "актуальную" запись.
в этой таблице
create table B(id int, name varchar(50), dateB datetime, rf_A_ID int)
сейчас может быть 100500 записей для каждого rf_A_ID с одинаковой датой - какая из них актуальная?
16 окт 12, 19:01    [13329122]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
В данной задаче изначально подразумевается что поле дата уникальна, т.е. новая запись фиксируется с новой датой. Каждый индикатор со своей датой сохранения.
16 окт 12, 19:13    [13329165]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Алексей Кр
В данной задаче изначально подразумевается что поле дата уникальна

в сруктуре ничего не подразумевается - всё либо обеспечивается, либо нет
вы ведь даже не знаете, обязательное ли поле id (к примеру)

ну это не моё дело, наверное. желаю удачи
16 окт 12, 19:19    [13329183]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Подскажите пожалуйста, как поступить с дополнительными условиями?

Еще немного тестовых данных
values(3, 'Индикатор3', '01-01-2002', 1)
insert into B(id, name, dateB, rf_A_ID)
values(4, 'Индикатор4', '01-01-2004', 1)
insert into B(id, name, dateB, rf_A_ID)
values(5, 'Индикатор5', '01-01-2007', 1)

insert into B(id, name, dateB, rf_A_ID)
values(6, 'Индикатор1', '01-01-2000', 2)
insert into B(id, name, dateB, rf_A_ID)
values(7, 'Индикатор2', '01-01-2010', 2)
insert into B(id, name, dateB, rf_A_ID)
values(8, 'Индикатор3', '01-01-2002', 2)
insert into B(id, name, dateB, rf_A_ID)
values(9, 'Индикатор4', '01-01-2004', 2)
insert into B(id, name, dateB, rf_A_ID)
values(10, 'Индикатор5', '01-01-2007', 2)


Выборка по условию (огромное спасибо Maxx):
select a.*, x.*
from A a
 inner join (
    select 
       b.*
      ,N = ROW_NUMBER()over (PARTITION BY b.rf_A_ID order by b.dateB desc) 
    from B b where (year(b.dateB) > 2001) and (YEAR(b.dateB) < 2008)
 ) x on x.rf_A_ID = a.id
where x.N = 1


Если выборку, которая представлена чуть выше, поместить в view, то как добавлять условия для первоначальной выборки данных?
Т.е. следующее например:
where (year(b.dateB) > 2001) and (YEAR(b.dateB) < 2008)
Подскажите пожалуйста!
17 окт 12, 08:54    [13330879]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
вместо view использовать функцию?
17 окт 12, 11:47    [13332120]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Алексей Кр
    where (year(b.dateB) > 2001) and (YEAR(b.dateB) < 2008)

Кстати, этот клёвый код лучше заменить на что-нибудь типа
    where (b.dateB >= '20020101' and b.dateB < '20080101') 

иначе индекс по дате (там же есть индекс по дате, правда?) не будет использован
17 окт 12, 11:54    [13332197]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Алексей Кр,

В параметрах отчета можешь оставить года
DECLARE 
    @y1 char(4), 
    @y2 char(4),
    @yd1 smalldatetime,
    @yd2 smalldatetime
    
SELECT @y1 =2001, @y1 =2008
SELECT 
    @yd1 = CONVERT(smalldatetime, @y1 +'0101'),  
    @yd2 = CONVERT(smalldatetime, @y2 +'0101')

--where (year(b.dateB) > 2001) and (YEAR(b.dateB) < 2008)
where b.dateB > @yd1 and b.dateB < @yd2
17 окт 12, 12:06    [13332356]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
trew
--where (year(b.dateB) > 2001) and (YEAR(b.dateB) < 2008)
where b.dateB > @yd1 and b.dateB < @yd2

условия year(b.dateB) > 2001 и b.dateB > @yd1 не тождественны
17 окт 12, 12:08    [13332376]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Про годы в условии добавил для простоты выборки данных...
Мне необходим сам принцип передачи условии, сделать view с выборкой select, но чтоб можно было бы указывать и другие параметры в условии where, не только жестко-завязанные параметры...
Можно попробовать оформить и в виде функции - но будет тогда, если не ошибаюсь, возвращаться переменная типа таблицы...
17 окт 12, 12:13    [13332427]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Зайцев Фёдор,

А, действительно. Там нужно 20020101
17 окт 12, 12:26    [13332545]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Поправил
DECLARE 
    @y1 int, 
    @y2 int,
    @yd1 smalldatetime,
    @yd2 smalldatetime
    
SELECT @y1 =2001, @y2 =2008
SELECT 
    @yd1 = CONVERT(smalldatetime, CONVERT(char(4),@y1 +1) +'0101'),  
    @yd2 = CONVERT(smalldatetime, CONVERT(char(4),@y2) +'0101')

where b.dateB >= @yd1 and b.dateB < @yd2
17 окт 12, 12:37    [13332691]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE @y1 INT=2001, @y2 INT=2008;

SELECT * FROM T WHERE D>=STR(@y1) AND D<STR(@y2);
И больше ничего не надо!

См. про строковый формат даты без разделителей из четырёх разрядов
17 окт 12, 14:42    [13334263]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Извиняюсь, но мы отклонились, повторяю свое сообщение с некоторыми корректировками:

Еще немного тестовых данных
values(3, 'Индикатор3', '01-01-2002', 1)
insert into B(id, name, dateB, rf_A_ID)
values(4, 'Индикатор4', '01-01-2004', 1)
insert into B(id, name, dateB, rf_A_ID)
values(5, 'Индикатор5', '01-01-2007', 1)

insert into B(id, name, dateB, rf_A_ID)
values(6, 'Индикатор1', '01-01-2000', 2)
insert into B(id, name, dateB, rf_A_ID)
values(7, 'Индикатор2', '01-01-2010', 2)
insert into B(id, name, dateB, rf_A_ID)
values(8, 'Индикатор3', '01-01-2002', 2)
insert into B(id, name, dateB, rf_A_ID)
values(9, 'Индикатор4', '01-01-2004', 2)
insert into B(id, name, dateB, rf_A_ID)
values(10, 'Индикатор5', '01-01-2007', 2)


Выборка по условию (огромное спасибо Maxx):
select a.*, x.*
from A a
 inner join (
    select 
       b.*
      ,N = ROW_NUMBER()over (PARTITION BY b.rf_A_ID order by b.dateB desc) 
    from B b where (b.dateB > @date1) and (b.dateB < @date2)
 ) x on x.rf_A_ID = a.id
where x.N = 1


Если выборку, которая представлена чуть выше, поместить в view, то как добавлять условия для первоначальной выборки данных?
Т.е. следующее например:
where (b.dateB > @date1) and (b.dateB < @date2)
Подскажите пожалуйста!

где @date1 и @date2 типа datetime
как сделать view, чтоб воспользоваться с дополнительными условиями ?
17 окт 12, 14:45    [13334302]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать актуальные записи из второй таблицы...  [new]
smallserg
Member

Откуда:
Сообщений: 82
Алексей Кр,

view - никак.

ХП или функция.
18 окт 12, 12:19    [13339583]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить