#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 и проблемой отображения.