我想提取所有拥有'read_value'的人,或'lnk_attributes_objects.value'或'attribute.name'等于'%gingivite%'。
我的请求看起来像这样:
SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM
FROM personne
LEFT JOIN instance_fiche_personnalisee ON (personne.id_personne=instance_fiche_personnalisee.id_patient)
LEFT JOIN objet ON (objet.id_patient = personne.id_personne)
LEFT JOIN datas_instance_fiche_perso ON (instance_fiche_personnalisee.id_instance = datas_instance_fiche_perso.id_instance)
LEFT JOIN lnk_attributs_objets ON (objet.pk_objet = lnk_attributs_objets.id_objet)
LEFT JOIN attributs ON (lnk_attributs_objets.id_attribut = attributs.pk_attribut)
WHERE (LOWER(datas_instance_fiche_perso.valeur_lisible) like '%gingivite%')
OR (LOWER(lnk_attributs_objets.valeur) like '%gingivite%')
OR (LOWER(attributs.nom) like '%gingivite%')
在我的小型数据库(926人)上已经需要4个小时。 有没有办法优化我的请求? 我是SQL的初学者。
备注:我使用LEFT JOIN,因为personne可以有一个valeur_lisible但没有对象(属性链接到objets)和反向。
我把我想要检查的值放在蓝色中作为gingivite。
我终于找到了如何大大减少这个请求的时间: - 使用INNER JOIN的UNION而不是LEFT JOIN - 将WHERE条件放入INNER JOIN'ON'
这是我的最终要求:
SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM FROM personne
INNER JOIN instance_fiche_personnalisee ON (personne.id_personne=instance_fiche_personnalisee.id_patient)
INNER JOIN datas_instance_fiche_perso ON (instance_fiche_personnalisee.id_instance = datas_instance_fiche_perso.id_instance)
AND LOWER(datas_instance_fiche_perso.valeur_lisible) like '%gingivite%'
UNION
SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM FROM personne
INNER JOIN objet ON (objet.id_patient = personne.id_personne)
INNER JOIN lnk_attributs_objets ON (objet.pk_objet = lnk_attributs_objets.id_objet) AND (LOWER(lnk_attributs_objets.valeur) like '%gingivite%')
UNION
SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM FROM personne
INNER JOIN objet ON (objet.id_patient = personne.id_personne)
INNER JOIN lnk_attributs_objets ON (objet.pk_objet = lnk_attributs_objets.id_objet)
INNER JOIN attributs ON (lnk_attributs_objets.id_attribut = attributs.pk_attribut) AND (LOWER(attributs.nom) like '%gingivite%')
它只需0.07s(而不是之前的4s)