首页 > 解决方案 > 创建 SELECT 以创建 VIEW 时遇到问题

问题描述

我正在尝试制作一个 VIEW 但首先我想让 SELECT 正确。我正在使用 SugarCRM 表格,但无法成功。我试着把它一部分一部分地做起来,第一次我得到了所有的行,但是每次我添加一个 INNER JOIN 时,我得到的行越来越少。

这是我的桌子

hu35p_huespedes_cstm hdata, /*TABLA DE HUESPEDES - GUEST TABLE*/
hu35p_reservas_cstm rdata, /*TABLA DE RESERVAS - RESERVATION TABLE*/
hu35p_visitas_cstm vdata, /*TABLA DE VISITAS - VISIT TABLE*/
lvr_libro_reclamaciones_cstm ldata, /*TABLA DEL LIBRO DE RECLAMACIONES - COMPLAINS TABLE*/
es_encuesta_satisfaccion_cstm edata, /*TABLA DE ENCUESTA DE SATISFACCION - POLL TABLE*/

hu35p_huespedes_hu35p_reservas_1_c hr, /*RELACIONA RESERVAS CON HUESPEDES - LINKS GUEST WITH RESERVATION*/
hu35p_huespedes_hu35p_visitas_1_c hv, /*RELACIONA HUESPEDES CON VISITAS - LINKS GUEST WITH VISIT*/
hu35p_huespedes_lvr_libro_reclamaciones_1_c hl, /*RELACIONA HUESPEDES CON LIBRO DE RECLAMACION - LINKS GUEST WITH COMPLAINS*/
hu35p_huespedes_es_encuesta_satisfaccion_1_c he, /*RELACIONA HUESPEDES CON ENCUESTA DE SATISFACCION - LINKS GUEST WITH POLL*/
hu35p_reservas_hu35p_visitas_1_c rv /*RELACIONA RESERVAS CON VISITAS - LINKS RESERVATION WITH VISIT*/

这是我正在尝试的查询

SELECT 

hdata.numero_documento_c as Numero_Documento, hdata.nombres_c as Nombres, 
hdata.apellido_paterno_c as Apellido_Paterno, hdata.apellido_materno_c as Apellido_Materno,
DATE_FORMAT(rdata.fecha_reserva_c, "%d-%m-%Y") as Fecha_Visita, rdata.numero_habitacion_c as Numero_Habitacion,
ldata.tipo_reclamacion_c as Tipo_Reclamacion,
edata.valor_c as Indice_Satisfacción,
vdata.importetotal_c as Importe_Total_Visita, vdata.importealojamiento_c as Alojamiento, vdata.importebar_c as Bar, vdata.importecomunicaciones_c as Comunicaciones, 
vdata.importeconvenciones_c as Convenciones, vdata.importedeportes_c as Deportes, vdata.importefrigobar_c as Frigobar, vdata.importelavanderia_c as Lavanderia,
vdata.importeninos_c as Ninos, vdata.importerestaurante_c as Restaurante, 
vdata.importetodoincluido_c as Todo_Incluido, vdata.importevarios_c as Varios, vdata.importewellness_c as Wellness

FROM        hu35p_huespedes_cstm hdata 
INNER JOIN  hu35p_huespedes_hu35p_reservas_1_c hr
ON          hdata.id_c = hr.hu35p_huespedes_hu35p_reservas_1hu35p_huespedes_ida
INNER JOIN  hu35p_reservas_cstm rdata
ON          rdata.id_c = hr.hu35p_huespedes_hu35p_reservas_1hu35p_reservas_idb
INNER JOIN  hu35p_huespedes_lvr_libro_reclamaciones_1_c hl
ON          hdata.id_c = hl.hu35p_huespedes_lvr_libro_reclamaciones_1hu35p_huespedes_ida
INNER JOIN  lvr_libro_reclamaciones_cstm ldata
ON          ldata.id_c = hl.hu35p_hues9aa7aciones_idb
INNER JOIN  hu35p_huespedes_es_encuesta_satisfaccion_1_c he
ON          hdata.id_c = he.hu35p_huespedes_es_encuesta_satisfaccion_1hu35p_huespedes_ida
INNER JOIN  es_encuesta_satisfaccion_cstm edata
ON          edata.id_c = he.hu35p_huesb4bffaccion_idb
INNER JOIN  hu35p_reservas_hu35p_visitas_1_c rv
ON          rdata.id_c = rv.hu35p_reservas_hu35p_visitas_1hu35p_reservas_ida
INNER JOIN  hu35p_visitas_cstm vdata
ON          vdata.id_c = rv.hu35p_reservas_hu35p_visitas_1hu35p_visitas_idb

当我这样做时

SELECT 

hdata.numero_documento_c as Numero_Documento, hdata.nombres_c as Nombres, 
hdata.apellido_paterno_c as Apellido_Paterno, hdata.apellido_materno_c as Apellido_Materno,
DATE_FORMAT(rdata.fecha_reserva_c, "%d-%m-%Y") as Fecha_Visita, rdata.numero_habitacion_c as Numero_Habitacion

FROM        hu35p_huespedes_cstm hdata 
INNER JOIN  hu35p_huespedes_hu35p_reservas_1_c hr
ON          hdata.id_c = hr.hu35p_huespedes_hu35p_reservas_1hu35p_huespedes_ida
INNER JOIN  hu35p_reservas_cstm rdata
ON          rdata.id_c = hr.hu35p_huespedes_hu35p_reservas_1hu35p_reservas_idb;

我得到了这个(500 行限制)

在此处输入图像描述

但是当我在查询中添加更多行时(像这样):

SELECT 

hdata.numero_documento_c as Numero_Documento, hdata.nombres_c as Nombres, 
hdata.apellido_paterno_c as Apellido_Paterno, hdata.apellido_materno_c as Apellido_Materno,
DATE_FORMAT(rdata.fecha_reserva_c, "%d-%m-%Y") as Fecha_Visita, rdata.numero_habitacion_c as Numero_Habitacion,
ldata.tipo_reclamacion_c as Tipo_Reclamacion

FROM        hu35p_huespedes_cstm hdata 
INNER JOIN  hu35p_huespedes_hu35p_reservas_1_c hr
ON          hdata.id_c = hr.hu35p_huespedes_hu35p_reservas_1hu35p_huespedes_ida
INNER JOIN  hu35p_reservas_cstm rdata
ON          rdata.id_c = hr.hu35p_huespedes_hu35p_reservas_1hu35p_reservas_idb
INNER JOIN  hu35p_huespedes_lvr_libro_reclamaciones_1_c hl
ON          hdata.id_c = hl.hu35p_huespedes_lvr_libro_reclamaciones_1hu35p_huespedes_ida
INNER JOIN  lvr_libro_reclamaciones_cstm ldata
ON          ldata.id_c = hl.hu35p_hues9aa7aciones_idb;

它出错并得到了这个(即使限制为 500 行也有 155 行)

在此处输入图像描述

标签: mysqljoinview

解决方案


关于创建视图的部分是无关紧要的。症结是从 SELECT语句返回的结果,要么是更少的行,要么是更多的预期行。

“缺失”行的最可能解释是其中一个表没有匹配的行。在这种情况下,JOIN 操作将排除不匹配的行。当我们想要返回不匹配的行时,我们可以使用外连接。当外部联接表中没有匹配的行时,外部联接将返回行。

对于在投诉表中有零行的客人,则此查询

SELECT ...
  FROM guest     g
  JOIN visit     v  ON v.guest_id = g.id
  JOIN complaint c  ON c.guest_id = g.id

将为该客人返回零行。

如果我们希望为投诉表中没有行的客人返回行,我们可以使用外连接。我们通过包含LEFT关键字来指定。例如:

SELECT ...
  FROM guest     g
  JOIN visit     v  ON v.guest_id = g.id
  LEFT
  JOIN complaint c  ON c.guest_id = g.id

请注意,此查询可能返回“重复”,例如,如果与多个投诉行匹配,则同一访问行的多个副本。

例如,有 4 次访问的客人有 2 次投诉,这可能会产生 8 行。每个投诉都将与每次访问相匹配。

这就是 SQL 中的集合操作的工作方式。


推荐阅读