2013-11-13 4 views
0

LAYOUT: У меня есть база данных подписчика с информацией подписчика в таблице, все с уникальными учетными записями.SQL: Compound Subset Select

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

Мне НЕОБХОДИМО: Мне нужен список самой последней записи истории, введенной в любой из баз данных History для каждого идентификатора учетной записи в данных подписчика. 1 запись на идентификатор учетной записи.

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

Помощь. Меня. Благодарю.

Вот то, что я уже пробовал, но это не дает мне одну запись за AccountID ...

SELECT 
MAIN.*, 
ISNULL(SubData.Name, '') AS [Name], 
ISNULL(SubData.AcctLineCode, '') AS AcctLineCode, 
ISNULL(LTRIM(RTRIM(SubData.AcctNum)), '') AS AcctNum 

FROM 
(
    SELECT AccountID, AlarmDate, AlarmCode FROM [History1113]..SignalHistory WHERE AccountID IN (SELECT DISTINCT AccountID FROM Subscriber..[Subscriber Data]) 
    UNION 
    SELECT AccountID, AlarmDate, AlarmCode FROM [History1013]..SignalHistory WHERE AccountID IN (SELECT DISTINCT AccountID FROM Subscriber..[Subscriber Data]) 
    UNION 
    SELECT AccountID, AlarmDate, AlarmCode FROM [History0913]..SignalHistory WHERE AccountID IN (SELECT DISTINCT AccountID FROM Subscriber..[Subscriber Data]) 
) 
AS MAIN 

LEFT JOIN Subscriber..[Subscriber Data] AS SubData ON Main.AccountID = SubData.AccountID 

ORDER BY AccountID, AlarmDate DESC 
+0

я получаю это правильно. у вас есть МНОЖЕСТВЕННЫЕ таблицы истории? – MichaelEvanchik

+0

Сколько таблиц истории у вас есть и что эти таблицы меняют имена? Есть несколько способов сделать это. – Twelfth

+0

, если у вас есть записи истории в отдельных * базах данных *, похоже, что вы собираетесь использовать несколько вариантов объединения –

ответ

2

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

Create view historytable 
as 
select * from historytable1 
union all 
select * from historytable2 
union all 
etc... 

Теперь запрос из historytable, как если бы это была таблица со всеми строками в нем.

Редактировать: В добавлении, которое вы добавили, нет агрегатов, поэтому у него нет метода фильтрации вниз (или группировки) в одну запись.

Для Вашего ответа:

Назовём мой взгляд выше основной, поэтому я не придется набирать так много.

Select account_id, max(alarm_date) as maxdate from main group by account_id 

Этот простой выбор возвращает к последней записи. Внутреннее соединение, чтобы оно функционировало как фильтр.

select ... 
from main 
inner join (Select account_id, max(alarm_date) as maxdate from main group by account_id) maxdate 
on main.account_id = maxdate.account_ID and maxdate.maxdate = main.alarm_date 

Добавить ваш абонент присоединиться к нижней части, что и заполнить графы, которые необходимо

+0

Я должен указать на это ... Получение данных из нескольких баз данных не было проблемой. Последний вопрос, который у меня есть, - это выбор записи MOST RECENT для каждого номера учетной записи, независимо от того, в какой базе данных она находится. Итак, у меня есть список номеров учетных записей. Мне нужно просеять несколько баз данных по номеру учетной записи, найдя самую последнюю запись, введенную для этого номера учетной записи. – Xarly

+0

Ответ отредактирован, чтобы включить в него некоторую логику max(). Простая идея, используйте запрос, чтобы найти account_id, и это максимальная дата предупреждения, а затем внутренняя связь с ним в основном запросе, чтобы использовать его в качестве фильтра. Вы получите несколько строк с этим, если у вас несколько учетных записей/alarm_dates, которые являются одинаковыми (обычно это не проблема, если дата включает компонент времени). – Twelfth

+0

См., Поэтому я прихожу сюда двенадцатым. Я не думал об атаке с реверса. Позвольте мне посмотреть, смогу ли я заставить это работать. – Xarly

0

С небольшой помощью от пары из вас, я был в состоянии понять это. Итак, спасибо всем.

Вот фрагмент кода, как я получил его на работу. Мне все еще нужно сделать несколько подключений, чтобы вводить учетную информацию, но это была сложная часть.

`

SELECT MAIN.AccountID, MAX(MAIN.AlarmDate) AS AlarmDate FROM 
(
SELECT AccountID, MAX(AlarmDate) AS AlarmDate FROM [History1113]..SignalHistory WHERE AccountID IN (SELECT DISTINCT AccountID FROM Subscriber..[Subscriber Data]) 
GROUP BY AccountID 

UNION 

SELECT AccountID, MAX(AlarmDate) AS AlarmDate FROM [History1013]..SignalHistory WHERE AccountID IN (SELECT DISTINCT AccountID FROM Subscriber..[Subscriber Data]) 
GROUP BY AccountID 

UNION 

SELECT AccountID, MAX(AlarmDate) AS AlarmDate FROM [History0913]..SignalHistory WHERE AccountID IN (SELECT DISTINCT AccountID FROM Subscriber..[Subscriber Data]) 
GROUP BY AccountID 
) 
AS MAIN 

GROUP BY MAIN.AccountID 

`

+0

извините, добавил комментарий, но оказалось, что я ошибся. хе-хе, рад помочь – Twelfth