SQl Server 2005: Как создать TSQL в соответствии с моей бизнес-логикой? - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть две таблицы: -

Table_01

  • Table01ID (int)
  • TestID (уникальный идентификатор)
  • TestDate (Datetime)
  • TestNo (varchar)

Table_02

  • Table02ID (int)
  • TestID (уникальный идентификатор - Fk из таблицы 01)
  • TransDate (DateTIme)
  • status = (int - 0 или 1)

Правила

  1. Таблица_02 может иметь более одной записи на TestID (FK)
  2. Таким образом, записи на TestID имеют статус = 1.
  3. но если статус равен 0. (это означает, что транзакция выполнена)

Например (Таблица_02): -

Table02ID  TestID                                  TransDate                Status
----------------------------------------------------------------------------------
1          {21EC2020-3AEA-1069-A2DD-08002B30309D}  01-10-2010 11:30:00.000  1
2          {21EC2020-3AEA-1069-A2DD-08002B30309D}  01-10-2010 11:35:00.000  1
3          {21EC2020-3AEA-1069-A2DD-08002B30309D}  01-10-2010 11:40:00.000  1
4          {21EC2020-3AEA-1069-A2DD-08002B30309D}  01-10-2010 11:59:00.000  1
5          {21EC2020-3AEA-1069-A2DD-08002B30309D}  01-10-2010 12:20:00.000  0

Теперь мне нужно: -

SELECT t.* 
FROM Table_01 t1
JOIN Table_02 t2 on t1.TestID = t2.TestID
WHERE 
     if t2.Status = 0 then Ignore the record (TestID)
     AND t2.Status = 1 then return only 1 Top Record order by t2.TransDate desc

Надеюсь, вы, ребята, поняли, что я имею в виду: | Пожалуйста, помогите?

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

@ Новичок: вот как я это сделаю.

Select * from Table_01 
Join
    (Select MAX(TransDate) as LatestDate, TestID, status from Table_02
            where TestID not in
                  (Select TestID from Table_02 where status = 0)
        group by TestID, status) as latestTrans 
on latestTrans.TestID = Table_01.TestID
order by latestTrans.LatestDate DESC

Средняя часть (строки 3-5) получает последнюю запись для каждого TestID (отфильтровывая те, которые вам не нужны) исоздает временную таблицу "latestTrans".Присоединение этого к исходному Table_01 дает вам все соответствующие столбцы Table_01 для каждой записи во временной таблице.

@ Ответ Raymund делает то же самое с немного другим синтаксисом.Я не уверен, какое решение будет работать лучше.Мой сценарий упрощает поддержку, так как оператор «group by» не будет расти, если вам нужно будет возвращать больше столбцов из Table_01, и легче добавить больше операторов объединения, если это необходимо.

ОБНОВЛЕНИЕ Я изменил скрипт, чтобы убрать любые TestID, где статус равен 0. Скрипт начинает казаться довольно сложным для на первый взгляд простой идеи, но это сложно, потому что вам нужно сгруппировать данные дважды, сначала по статусу, а затемпо TestID (чтобы получить MaxDate).

Примечание. Я снял проверку на статус = 1, предполагая, что все возможные значения для «статуса» равны 0 и 1. Вставьте обратно, если это не так.

0 голосов
/ 03 ноября 2010

попробуйте

SELECT    t1.Table01ID, t1.TestNo, t1.TestDate, MAX(t2.TransDate), t2.TestID, t2.status
FROM         Table_02 t2 INNER JOIN
                      Table_01 t1 ON t2.TestID = t1.TestID
GROUP BY t2.status, t2.TestID, t1.Table01ID, t1.TestDate, t1.TestNo
HAVING      (t2.status = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...