Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

Помогите пожалуйста правильно составить запрос.   Найти похожие ветки 

 
r9000   (2006-12-25 06:10) [0]

Добрый день!

Изменяю запрос в котором изначально выводятся все записи с кодами AnalyticType=15 and AnalyticCode=2. Мне необходимо чтобы в результирующий набор не включались записи с кодами AnalyticType=15 и AnalyticCode=2,если промежуток между датами для записей с этим кодами был меньше или равен 180 дням.

SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )
group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue

Правильно ли я написал запрос? Он таким должен быть?

SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )

---это то что я вставил
and not exists (select * from RecipientAnalyticCodes RecAn,PensionContracts P,
RecipientAccounts R where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
and datediff(day,R.LastOperDate,"09.01.2006" )<=180)
---это то что я вставил

group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue


 
ЮЮ ©   (2006-12-25 06:28) [1]


> промежуток между датами для записей  с этим кодами был меньше или равен 180 дням

datediff(day,R.LastOperDate,"09.01.2006" )<=180)


так между записями или
последней записью и указанной датой "09.01.2006"


 
r9000   (2006-12-25 06:36) [2]

Между датой "09.01.2006" и датой R.LastOperDate записи


 
ЮЮ ©   (2006-12-25 06:38) [3]

Может задачу можно свести к следующей: "Для каждоой пары RecAn.AnalyticCode и AnCode.AnCodeValue не реже, чем каждые 180 дней должна появляться  запись в RecipientAccounts. И нас интересуют такие пары, для которой "свежей" записи до сих пор (на текущую дату) нет" ?


 
ЮЮ ©   (2006-12-25 06:46) [4]


> r9000   (25.12.06 06:36) [2]

Тогда, похоже, всё просто сводится к подсчету тех записей, у которых R.LastOperDate >= "08.07.2006" ?


 
r9000   (2006-12-25 06:47) [5]

Нет необходимо исключить  записи с кодами AnalyticType=15 и AnalyticCode=2,если промежуток между датами для записи с этими кодами был меньше или равен 180 дням


 
r9000   (2006-12-25 06:48) [6]

Только для этих кодов справедливо это условие


 
ЮЮ ©   (2006-12-25 07:00) [7]

Короче, хватит умничать, на пальцах лучше покажи :) Итак, для одного реципиента имеем несколько записей

AnalyticType AnalyticCode  LastOperDate
15                    2               31.12.05
15                    2               08.01.06
15                    2               09.01.06
15                    2               09.05.06
15                    2               09.10.06

и некую дату 09.01.06. Какие записи надо исключит (оставить) и почему


 
r9000   (2006-12-25 07:05) [8]

Первую запись с
AnalyticType AnalyticCode  LastOperDate
15                    2               31.12.05
включаем в результирующий набор, так как
"09.01.2006" -LastOperDate>180, остальные записи должны быть исключены
, так как "09.01.2006" -LastOperDate<=180


 
ЮЮ ©   (2006-12-25 07:14) [9]

Мимо, "09.01.2006" - 31.12.05 = 10 дней.

Т.е. тебя совершенно не интересуют записи
1) после 09.01.2006, независимо от срока
2) в интервале (09.01.2006 - 180) ... 09.01.06

т.е. на дату  09.01.2006 тебя интересуют записи раньше 13.07.05 ?


 
r9000   (2006-12-25 07:27) [10]

ну да здесь я немного ошибся с этой записью
Да на дату  09.01.2006 меня интересуют записи раньше 13.07.05 ,т.к.
разница превышает 180 дней
после 09.01.2006 не интересуют, т.к. например 09.01.2006 -10.01.2006
будет -1, что меньше 180 дней и т.д.
в интервале (09.01.2006 - 180) не интересуют


 
ЮЮ ©   (2006-12-25 07:58) [11]

Т.е. абсолютно все записи раньше 13.07.05 для данного реципиента, сколько бы их не было. И каждая запись в сумму входит единицей?

Я бы просто отобрал нужные записи в WHERE. (Перкместив условия связи таблиц оттуда туда, где им положено быть):

SELECT
 RecAn.AnalyticCode ,
 AnCode.AnCodeValue ,
 count(C.Recipient)
FROM
 PlacesOfWork A
 JOIN Companies ON A.Company = Companies.Company
 JOIN Recipients C ON A.Recipient = C.Recipient
 JOIN PensionContracts P ON C.Recipient = P.Recipient
 JOIN RecipientAccounts R ON P.RecipientAccount = R.RecipientAccount
 JOIN RecipientAnalyticCodes RecAn ON RecAn.Recipient = C.Recipient
 JOIN AnalyticCodesByDate AnCode ON
   (AnCode.AnalyticType = RecAn.AnalyticType) and
   (AnCode.AnalyticCode = RecAn.AnalyticCode )
WHERE
  not (
    (RecAn.AnalyticType = 15) and (RecAn.AnalyticCode = 2) and
    (datediff(day, R.LastOperDate, "09.01.2006" )<= 180)
  )
GROUP BY
 AnCode.AnalyticType, RecAn.AnalyticCode, AnCode.AnCodeValue


Кстати, таблицы PlacesOfWork,  Companies и PensionContracts в этом запросе совсем не нужны.


 
r9000   (2006-12-25 08:13) [12]

А разве в моем запросе сделано неправильно?


 
r9000   (2006-12-25 08:37) [13]

Кстати, нужно отсечь записи у которых разница <= 180
для записей у которых
RecAn.AnalyticType = 15 and RecAn.AnalyticCode = 2
а не для всех записей, т.к.
могут быть записи с различной аналитикой, например:
RecAn.AnalyticType = 15 and RecAn.AnalyticCode = 3 и т.д.
И если сделать запрос типа вашего
SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )

not (
   (RecAn.AnalyticType = 15) and (RecAn.AnalyticCode = 2) and
   (datediff(day, R.LastOperDate, "09.01.2006" )<= 180)
 )

group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue

то по результату он ничем не отличается от запроса
SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )

group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue

а это неправильно я проверил


 
ЮЮ ©   (2006-12-25 08:57) [14]


> Кстати, нужно отсечь записи у которых разница <= 180
> для записей у которых
> RecAn.AnalyticType = 15 and RecAn.AnalyticCode = 2


not (
  (RecAn.AnalyticType = 15) and (RecAn.AnalyticCode = 2) and
  (datediff(day, R.LastOperDate, "09.01.2006" )<= 180)
)

если  (RecAn.AnalyticType <> 15) или (RecAn.AnalyticCode <> 2) ,
то выражение в скобках будет ложь и запись останется в выборке.


>
> то по результату он ничем не отличается от запроса


Перед тем, как считать Count, полезно посмотреть на сами записи:

SELECT
 RecAn.AnalyticCode ,
 AnCode.AnCodeValue ,
 datediff(day, R.LastOperDate, "09.01.2006" ) as Diff ,
*
FROM
 ...
без GROUP BY

и выполни запросы как с условием, так и без. Их и сравнивай, анализируя, что  в столбце Diff


 
r9000   (2006-12-25 09:46) [15]

Скажите а мой запрос разве неправилен
SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )

---это то что я вставил
and not exists (select * from RecipientAnalyticCodes RecAn,PensionContracts P,
RecipientAccounts R where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
and datediff(day,R.LastOperDate,"09.01.2006" )<=180)
---это то что я вставил

group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue

Он вроде по результату дает более правильное количество


 
ЮЮ ©   (2006-12-25 09:56) [16]


> Он вроде по результату дает более правильное количество
>

Сначала ответь какие неправильные строки были в запросе из [14]

Скажите а мой запрос разве неправилен
Неправилен. При наличии хоть одной записи, удовлетворяющей  условию

AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
никакая запись об этом реципиенте вообще не попадет в статистику, т.к. связка подзапрос с запросом идет только по одному полю  RecAn.Recipient=C.Recipient.
Такие подзапросы тяжелы для любого сервера.


 
r9000   (2006-12-25 10:16) [17]

Так в моем же запросе есть кроме AnalyticType=15 and AnalyticCode=2
двух условий третье условие and datediff(day,R.LastOperDate,"09.01.2006" )<=180 и вы забыли что связки P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient связывают ее с таблицей RecipientAccounts R.


 
ЮЮ ©   (2006-12-25 10:37) [18]

Ты так и будешь на кофейной гуще гадать?

Выполни подзапрос, что в not Exist().  (1)

теперь свой, только со *, без count и group by. И найди там хоть одну строку для реципиентов из (2). Нашел? То-то.

и вы забыли что связки P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient связывают ее с таблицей RecipientAccounts R.

Но они никак не связаны с RecAn.AnalyticCode и AnCode.AnCodeValue. А это значит:
Пусть для реципиента найдена запись с AnalyticType<>15 или AnalyticCode<>2.
Но она не будет включена в выборку, если у этого же реципиента есть хотя бы одна запись, которую ты хочешь исключить. В подзапросе на Exist нет никакого анализа текущих значений  RecAn.AnalyticCode и AnCode.AnCodeValue. А если добавить, то в exist подзапросе получишь полный аналог самого запроса. И зачем? Чтобы сервер для каждой записи основного запроса выполнял этот подзапрос, вместо того, чтобы просто отсеять лишние записи?


 
r9000   (2006-12-25 11:36) [19]

Из того что ты сказал следует
что запрос

SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )

---это то что я вставил
and not exists (select * from RecipientAnalyticCodes RecAn,PensionContracts P,
RecipientAccounts R where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
and datediff(day,R.LastOperDate,"09.01.2006" )<=180)
---это то что я вставил

group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue

должен дать одинаковый результат с запросом

SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )

---это то что я вставил
and not exists (select * from RecipientAnalyticCodes RecAn,PensionContracts P,
RecipientAccounts R where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
)
---это то что я вставил

group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue

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


 
ЮЮ ©   (2006-12-25 12:08) [20]

Из того что ты сказал следует
что запрос  (1)  должен дать одинаковый результат с запросом (2).

Если ты сделал такие выводы, то я то тут причем.
В запросе (1) по определению останется записей не меньше чем в (2).
Т.к. в (1) ты потеряешь только тех реципиентов, у которых есть "давние" данные (datediff(day,R.LastOperDate,"09.01.2006" )<=180), а в (2) потеряешь всех, у кого есть какие либо  данные с AnalyticType=15 and AnalyticCode=2.

Извини, но пока не сделаешь нормального анализа, предложенного [14]
Перед тем, как считать Count, полезно посмотреть на сами записи:

SELECT
RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
datediff(day, R.LastOperDate, "09.01.2006" ) as Diff ,
*
FROM
...
без GROUP BY

и выполни запросы как с условием, так и без. Их и сравнивай, анализируя, что  в столбце Diff


считаю вести дискуссию бесполезной тратой времени.


 
r9000   (2006-12-25 12:14) [21]

Да еще запрос данный я сократил немного. Вообще он выглядит так:
SELECT convert(varchar(20),"46") as Company,
RecAn.AnalyticCode as "РНН" ,
AnCode.AnCodeValue as "Наименование",
null as "Код Подразделения",
null as "Наименование Подразделения",
count(C.Recipient) as "Количество"
FROM
PlacesOfWork  A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where  A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )
and P.Closed=0
and P.OpenDate <= "09.01.2006"
and R.CreditRest>0
and RecAn.AnalyticType=46
and RecAn.AnalyticCode<>17
and not exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=3)
and  exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=48 and AnalyticCode=1)
and not exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=4)

and A.PlacesID = (SELECT Max(B.PlacesID)
FROM PlacesOfWork B where B.Recipient=A.Recipient and B.BeginDate<="09.01.2006" GROUP BY B.Recipient)
group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue
order by  RecAn.AnalyticCode

Поэтому возможно еще, что если мы вставим
not (
   (RecAn.AnalyticType = 15) and (RecAn.AnalyticCode = 2) and
   (datediff(day, R.LastOperDate, "09.01.2006" )<= 180)
 )
в данный запрос, результат будет неправильным.
И Recipient может иметь одновременно несколько разных записей AnalyticType,AnalyticCode поэтому может быть еще данное условие не
может подходить.


 
r9000   (2006-12-25 13:02) [22]

В 20 сообщении ты пишешь:
>В запросе (1) по определению останется записей не меньше чем в (2).
>Т.к. в (1) ты потеряешь только тех реципиентов, у которых есть "давние" >данные (datediff(day,R.LastOperDate,"09.01.2006" )<=180),

Я бы сказал потеряю данные  которые удовлетворяют 3 условиям
(RecAn.AnalyticType = 15) and (RecAn.AnalyticCode = 2) and
(datediff(day, R.LastOperDate, "09.01.2006" )<= 180). Я так тебя понял?
Тогда еще раз в чем неправилен мой запрос:
SELECT convert(varchar(20),"46") as Company,
RecAn.AnalyticCode as "РНН" ,
AnCode.AnCodeValue as "Наименование",
null as "Код Подразделения",
null as "Наименование Подразделения",
count(C.Recipient) as "Количество"
FROM
PlacesOfWork  A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where  A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )
and P.Closed=0
and P.OpenDate <= "09.01.2006"
and R.CreditRest>0
and RecAn.AnalyticType=46
and RecAn.AnalyticCode<>17
and not exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=3)
and  exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=48 and AnalyticCode=1)
and not exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=4)

---это то что я вставил
and not exists (select * from RecipientAnalyticCodes RecAn,PensionContracts P,
RecipientAccounts R where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
and datediff(day,R.LastOperDate,"09.01.2006" )<=180)
---это то что я вставил

and A.PlacesID = (SELECT Max(B.PlacesID)
FROM PlacesOfWork B where B.Recipient=A.Recipient and B.BeginDate<="09.01.2006" GROUP BY B.Recipient)
group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue
order by  RecAn.AnalyticCode


 
ЮЮ ©   (2006-12-26 03:32) [23]

and RecAn.AnalyticType=46
and RecAn.AnalyticCode<>17
and not exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=3)
and  exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=48 and AnalyticCode=1)
and not exists (select * from RecipientAnalyticCodes RecAn where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=4)


Теперь ещё и это всплыло !!!

Тогда еще раз в чем неправилен мой запрос:

Я даже не знаю что тебе надо получить этим запросом, а ты спрашиваешь, что непроавильно? Тебе что, на русский перевести то, что ты наваял в запросе?

Найти разные значения AnCode.AnCodeValue и их количество для RecAn.AnalyticType=46 и  RecAn.AnalyticCode<>17 имевших место до 09.01.2006  для работников по последнему (до 09.01.2006) месту работы.
Не всключать показания тех работников, у которых:
а)  есть показания (AnalyticType=15 and AnalyticCode=3) независимо от даты таких показаний
б)  есть показания (AnalyticType=48 and AnalyticCode=1) независимо от даты таких показаний
в)  есть показания (AnalyticType=15 and AnalyticCode=4) независимо от даты таких показаний
г)  есть показания (AnalyticType=15 and AnalyticCode=2) полученные ранее 08.07.2005

Если это именно то, что тебе надо, то запрос правильный.


>
> Поэтому возможно еще, что если мы вставим
> not (
>    (RecAn.AnalyticType = 15) and (RecAn.AnalyticCode = 2)
> and
>    (datediff(day, R.LastOperDate, "09.01.2006" )<= 180)
>  )
> в данный запрос, результат будет неправильным.


Это вставлять не нужно, т.к. запрос выбирает данные только с RecAn.AnalyticType=46, и эта добавканикак не повлияет на выборку


 
r9000   (2006-12-26 06:14) [24]

Да, как вы пишете в пункте г)
не включаются показания у тех работников, у которых
есть показания (AnalyticType=15 and AnalyticCode=2) полученные ранее 08.07.2005.
Это то что я и хотел получить. Спасибо.


 
ЮЮ ©   (2006-12-26 06:50) [25]

---это то что я вставил
and not exists (select * from RecipientAnalyticCodes RecAn,PensionContracts P,
RecipientAccounts R where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
and datediff(day,R.LastOperDate,"09.01.2006" )<=180)
---это то что я вставил


Внимательно глянув на код ещё, обратил внимание, что  RecAn никак не связана с таблицами P и R. Поздравляю!
Именно таких ошибок и можно избежать, отказавшись от неявной связи в пользу явной.

select *
from
 RecipientAnalyticCodes RecAn,
 PensionContracts P,
 RecipientAccounts R
where
 RecAn.Recipient=C.Recipient and
 AnalyticType=15 and
 AnalyticCode=2 and
 P.RecipientAccount=R.RecipientAccount and
 C.Recipient = P.Recipient and
 datediff(day,R.LastOperDate,"09.01.2006" )<=180)


 
r9000   (2006-12-26 06:55) [26]

Так вы считаете
запрос
select *
from
RecipientAnalyticCodes RecAn,
PensionContracts P,
RecipientAccounts R
where
RecAn.Recipient=C.Recipient and
AnalyticType=15 and
AnalyticCode=2 and
P.RecipientAccount=R.RecipientAccount and
C.Recipient = P.Recipient and
datediff(day,R.LastOperDate,"09.01.2006" )<=180)

неправильным?
Тогда как должен выглядеть правильный?


 
r9000   (2006-12-26 06:59) [27]

А разве связка C.Recipient  не связывает ее с таблицей Р C.Recipient = P.Recipient , а от этой связи P.RecipientAccount=R.RecipientAccount


 
ЮЮ ©   (2006-12-26 09:52) [28]

RecAn.Recipient=C.Recipient
C.Recipient = P.Recipient

это, по сути, фильтры, а не связи таблиц

Из   RecipientAnalyticCodes возьмутся все записи текущего реципиента, и из  RecipientAccounts возьмутся все записи текущего реципиента и тупо перемножатся. В результате имели
08.05.05  15 3
01.06.06  15 2
и человек не должен был исключаться из списка, а получим
08.05.05  15 3
08.05.05  15 2
01.06.06  15 3
01.06.06  15 2
и мы его исключим из-за второй строки

Тогда как должен выглядеть правильный?

select *
from
 RecipientAnalyticCodes RecAn
 JOIN PensionContracts P ON RecAn.Recipient = P.Recipient
 JOIN RecipientAccounts R ON P.RecipientAccount = R.RecipientAccount
where
 RecAn.Recipient =  C.Recipient and
 AnalyticType=15 and
 AnalyticCode=2 and
 datediff(day,R.LastOperDate,"09.01.2006" )<=180)


 
r9000   (2006-12-26 12:22) [29]

Да получается я связь одну забыл RecAn.Recipient = P.Recipient
Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2007.03.18;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.053 c
2-1172043399
dimas#
2007-02-21 10:36
2007.03.18
MDI форма


2-1172252904
rar
2007-02-23 20:48
2007.03.18
преобразовть формат DateTime


2-1172155883
\/ainu
2007-02-22 17:51
2007.03.18
Простая прога


15-1171961180
Ученик чародея
2007-02-20 11:46
2007.03.18
Как именно пираты вредят развитию IT-области?


15-1171729161
ProgRAMmer Dimonych
2007-02-17 19:19
2007.03.18
Подскажите новичку