无法创建SELECT来进行查看

时间:2019-07-16 16:40:29

标签: mysql join 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行上限)

enter image description here

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

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行)

enter image description here

1 个答案:

答案 0 :(得分:0)

创建视图有点多余。症结是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中的set操作的工作方式。