@Richard_Ferlow
Веб-программист

Как доделать запрос SQL чтобы исключить варианты?

SELECT
          a.*
        FROM(
            SELECT
                dbo.recipient.id,
                dbo.recipient.name,
                dbo.recipient.email,
                dbo.recipient.phone/*,
                dbo.reservation.humanid
                dbo.reservation.number,
                dbo.reservation.cdate*/

            FROM
                (SELECT
                   (SELECT top 1 dbo.human.id
                    FROM dbo.human
                     INNER JOIN dbo.people ON dbo.people.humanid = dbo.human.id
                     INNER JOIN dbo.recipient ON dbo.recipient.id = dbo.human.id
                    WHERE  dbo.people.reservationid = p.id AND (dbo.recipient.phone != '' OR  dbo.recipient.email != '')
                    ORDER BY dbo.human.born) AS huid,
                   p.id,
                   p.number
                 FROM dbo.reservation AS p
                 WHERE  (SELECT top 1 dbo.human.id FROM dbo.human
                         INNER JOIN dbo.people ON dbo.people.humanid = dbo.human.id
                         INNER JOIN dbo.recipient ON dbo.recipient.id = dbo.human.id
                        WHERE dbo.human.born IS NOT NULL AND dbo.people.reservationid = p.id
                         ) IS NOT NULL AND p.statusid = 1 
                  )
                AS huborn
                    INNER JOIN dbo.recipient ON dbo.recipient.id = huborn.huid
                    INNER JOIN dbo.human ON huborn.huid = dbo.human.id
                    INNER JOIN dbo.reservation ON dbo.reservation.id = huborn.id
                    INNER JOIN (SELECT MIN(dbo.subclaim.datebeg)AS dbeg,
                                      dbo.subclaim.reservationid FROM dbo.subclaim
                      GROUP BY dbo.subclaim.reservationid
                                )AS sub ON sub.reservationid = dbo.reservation.id

            WHERE

                 (dbo.human.human = 'ADL') AND (dbo.human.born IS NOT NULL)
					AND DateDiff(day, sub.dbeg, '2015-07-07')  < 548 
                    
                  
      ) AS a GROUP by a.id, a.name, a.phone, a.email


На основе одного примера создал такой запрос, его задача - выбрать из базы людей которые были нашими клиентами за последние 548 дней(полтора года).

Теперь нужно выбрать тех кто ездил с нами больше чем полтора года назад, но нужно исключить тех из них, кто все таки покупал за последние полтора(т.е. человек регулярно покупает допустим).

Я думал можно просто обойтись добавив WHERE a.id NOT IN()

) AS a WHERE a.id NOT IN() GROUP by a.id, a.name, a.phone, a.email


и соответственно в IN внутрь поместить выборку ту что выше, однако оказалось что такой запрос если и выполнится, то крайне долго. подозреваю что это связано с тем что выбирая 10тыс записей на каждуню наверное еще по запросу для NOT IN формируется. может быть эти данные предварительно как-то запомнить можно, чтобы запрос для NOT IN один раз проходил?

ну или может ошибаюсь и проблема в другом. с SQL подобным только разбираюсь, до этого в основном примитивными SELECT оперировал.
  • Вопрос задан
  • 294 просмотра
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Замените in соответствующим join.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы