我正在尝试进行查看,但首先我想使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行)
答案 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操作的工作方式。