mysql - 创建 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 行)
解决方案
关于创建视图的部分是无关紧要的。症结是从 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 中的集合操作的工作方式。
推荐阅读
- android - react native 无法构建android apk。gradlew clean and ... 命令失败
- database - 从应用程序更新多个 maria 数据库实例的最佳实践
- scala - rdd.map() 没有调用指定的函数
- git - 在 github 中上传跟踪的文件
- c# - 通过C#中的正则表达式获取子字符串
- python - 删除用户时如何删除与用户关联的所有文件
- database - 在 Amazon Redshift 上选择正确的排序键
- java - 当我尝试将多个数据插入子表时,会发生错误无法执行 JDBC 批量更新
- c# - 有没有办法将 nuget 包引用从一个解决方案复制到 .net-core 中的另一个解决方案?
- unity3d - Unity 构建的应用程序只有背景颜色