SQL слева присоединяется к 2 таблицам, где условие

#mysql #sql #join #left-join

#mysql #sql #Присоединиться #левое соединение

Вопрос:

У меня есть 2 таблицы: AllClients и AllPolicies. Я пытаюсь найти записи клиента, в которых нет «активных политик». Активная политика — это политика, в которой дата вступления в силу — до сегодняшнего дня, а дата истечения срока действия — после сегодняшнего дня. Вот sql, который я придумал, но он не будет выполняться:

 SELECT ac.LookupCode
  FROM AllClients ac
  LEFT JOIN AllPolicies ap 
    ON ap.LookupCode = ac.LookupCode
   AND ap.EffectiveDate  < '2014-06-24'
   AND ap.ExpirationDate > '2014-06-24'
  

Я использую MySQL и получаю какие-то странные ошибки «неизвестный статус таблицы: TABLE_TYPE». Я вполне уверен, что мой оператор SQL — это мусор 😉 Спасибо за помощь!

Ответ №1:

 SELECT LookupCode
FROM AllClients
where LookupCode not in 
    (select LookupCode 
    from AllPolicies
    where EffectiveDate < '2014-06-24' and ExpirationDate > '2014-06-24')
  

Комментарии:

1. Это работает, но невероятно медленно. Любые предложения о том, как ускорить это?

2. Попробуйте создать индекс (отдельный) для поискового кода столбца в обеих таблицах, СОЗДАЙТЕ ИНДЕКС <<имя_индекса>> ДЛЯ <<имя столбца с типом и размером>>

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

Ответ №2:

Это может помочь. Вы мало рассказали о своих ошибках MySQL, и они могут иметь какое-то отношение к вашим структурам таблиц или настройке сервера.

 SELECT
 ac.LookupCode
FROM
 AllClients ac
 LEFT JOIN AllPolicies ap ON ap.LookupCode = ac.LookupCode
  AND ap.EffectiveDate < @Today
  AND ap.ExpirationDate > @Today
WHERE
 ap.LookupCode IS NULL --This means do not get records that have active policies
  

Комментарии:

1. Я получаю те же сообщения об ошибках по этому поводу. Точное сообщение об ошибке: «неизвестный статус таблицы: TABLE_TYPE». Я бы хотел изложить, но это все, что показано в сообщении об ошибке. Запрос выполняется в течение длительного времени, прежде чем эта ошибка будет выдана. Спасибо за помощь до сих пор!

2. Это также дает мне учетные записи с активными политиками, а не учетные записи с неактивными политиками. Я считаю, что сообщение об ошибке связано с phpmyadmin, так что это несколько неуместно.

Ответ №3:

 > SELECT AllClients.LookupCode FROM AllClients Left Join AllPolicies on
> AllPolicies.LookupCode = AllClients.LookupCode
>      and date(AllPolicies.EffectiveDate) < date '2014-06-24'
>      and date(AllPolicies.ExpirationDate) > date '2014-06-24';
  

Комментарии:

1. Это дает мне учетные записи с активными политиками, а не учетные записи без активных политик.

Ответ №4:

Устранение неполадок следующим образом. Начните с этого:

 select ac.*
from AllClients ac
where 1 = 2
  

Если он выполняется успешно, перейдите к этому

 select ac.LookUpCode
from AllClients ac
where 1 = 2
  

Тогда это:

 select ac.LookUpCode
from AllClients ac left AllPolicies ap on 1 = 2
where 1 = 2
  

Продолжайте, добавляя по одному биту за раз. Как только вы получите ошибку, вы узнаете, что ее вызвало.

Комментарии:

1. Спасибо, но я думаю, что ошибка связана с phpmyadmin и проблемой отображения.