SQL 查询创建的重复行太多
SQL Query is creating way too many repeated rows
我对 sql 查询以及输出的显示方式有疑问,你看,我有 3 个 table 并且至少有一个共同字段,问题是什么时候我将 2 tables 连接在一起,我需要的信息显示正确,但是当我连接第三个时,输出变得疯狂并且重复结果太多,我需要弄清楚为什么会发生,在下面我'我会向您展示所有 table 和彼此之间的关系
这就是 table 之间的关系
这就是第一个 table (dbo_predios) 的制作方式,前三个字段在这种情况下是唯一相关的
这就是第二个 table (dbo_permisos_obras_mayores) 的制作方式,前三个字段在这种情况下也是唯一相关的,后两个可以匹配第一个 table (dbo_predios)
这里是第三个 table (dbo_recepciones_obras_mayores) 的制作方式,第四个字段在这种情况下是唯一相关的,它可能与第二个 table (dbo_permisos_obras_mayores) 到同名字段
好的,现在是结构化的,现在我正在执行的查询如下:
SELECT
dbo_predios.codigo_unico_predio,
dbo_permisos_obras_mayores.numero_permiso_edificacion,
dbo_permisos_obras_mayores.fecha_permiso_edificacion
FROM dbo_predios
INNER JOIN dbo_permisos_obras_mayores ON dbo_predios.codigo_manzana_predio = dbo_permisos_obras_mayores.codigo_manzana_predio AND dbo_predios.codigo_lote_predio = dbo_permisos_obras_mayores.codigo_lote_predio
INNER JOIN dbo_recepciones_obras_mayores ON dbo_permisos_obras_mayores.numero_recepcion_permiso = dbo_recepciones_obras_mayores.numero_recepcion_permiso
WHERE dbo_permisos_obras_mayores.codigo_manzana_predio = 9402 AND dbo_permisos_obras_mayores.codigo_lote_predio = 30
以这种方式执行查询的结果是这样的:
后来我做了一些尝试和错误并删除了第二个内部连接线,结果让我感到惊讶,这是发生了什么:
结论:简而言之,第三个 table 导致了笛卡尔积,为什么?我希望我知道为什么,您如何看待这个特殊案例?我会感谢你能给我的任何帮助,提前致谢。
好吧,我按照 Icarus 告诉我的做了,我想出了一些有用的东西,你看,我犯了一个大错误,我尝试的数字组合没有 numero_recepcion_permiso
所以输出列是完全空白的,但是当有一个实际的 numero_recepcion_permiso
它显示正确时,无论如何我仍然需要不输出那么多重复行,我该如何解决?感谢大家到目前为止的帮助
首先,确保两个值都存在于两个字段中并且它们实际上匹配,否则可能会生成那么多的重复行,但是重复的行数是我无法判断的,因为我不知道知道你的实际数据是什么,但这可能会稍微解决这个问题
这是解决方案 - 因为你说 numero_recepcion_permiso 是空白的,只需将条件添加到内部联接,以排除空的:
SELECT
dbo_predios.codigo_unico_predio,
dbo_permisos_obras_mayores.numero_permiso_edificacion,
dbo_permisos_obras_mayores.fecha_permiso_edificacion
FROM dbo_predios
INNER JOIN dbo_permisos_obras_mayores ON dbo_predios.codigo_manzana_predio = dbo_permisos_obras_mayores.codigo_manzana_predio AND dbo_predios.codigo_lote_predio = dbo_permisos_obras_mayores.codigo_lote_predio
INNER JOIN dbo_recepciones_obras_mayores ON dbo_permisos_obras_mayores.numero_recepcion_permiso = dbo_recepciones_obras_mayores.numero_recepcion_permiso
AND dbo_recepciones_obras_mayores.numero_recepcion_permiso <>''
WHERE dbo_permisos_obras_mayores.codigo_manzana_predio = 9402 AND dbo_permisos_obras_mayores.codigo_lote_predio = 30
话虽如此,该字段应该允许为空还是 NULL
?也许您需要向 table 添加约束以防止出现这种情况。另一个建议 - 为什么选择 NUMERIC(18,0)
作为那些 table 的主键的数据类型?我更喜欢简单的 INT
或 BIGINT
,也许让数据库为我生成序列。
我对 sql 查询以及输出的显示方式有疑问,你看,我有 3 个 table 并且至少有一个共同字段,问题是什么时候我将 2 tables 连接在一起,我需要的信息显示正确,但是当我连接第三个时,输出变得疯狂并且重复结果太多,我需要弄清楚为什么会发生,在下面我'我会向您展示所有 table 和彼此之间的关系
这就是 table 之间的关系
这就是第一个 table (dbo_predios) 的制作方式,前三个字段在这种情况下是唯一相关的
这就是第二个 table (dbo_permisos_obras_mayores) 的制作方式,前三个字段在这种情况下也是唯一相关的,后两个可以匹配第一个 table (dbo_predios)
这里是第三个 table (dbo_recepciones_obras_mayores) 的制作方式,第四个字段在这种情况下是唯一相关的,它可能与第二个 table (dbo_permisos_obras_mayores) 到同名字段
好的,现在是结构化的,现在我正在执行的查询如下:
SELECT
dbo_predios.codigo_unico_predio,
dbo_permisos_obras_mayores.numero_permiso_edificacion,
dbo_permisos_obras_mayores.fecha_permiso_edificacion
FROM dbo_predios
INNER JOIN dbo_permisos_obras_mayores ON dbo_predios.codigo_manzana_predio = dbo_permisos_obras_mayores.codigo_manzana_predio AND dbo_predios.codigo_lote_predio = dbo_permisos_obras_mayores.codigo_lote_predio
INNER JOIN dbo_recepciones_obras_mayores ON dbo_permisos_obras_mayores.numero_recepcion_permiso = dbo_recepciones_obras_mayores.numero_recepcion_permiso
WHERE dbo_permisos_obras_mayores.codigo_manzana_predio = 9402 AND dbo_permisos_obras_mayores.codigo_lote_predio = 30
以这种方式执行查询的结果是这样的:
后来我做了一些尝试和错误并删除了第二个内部连接线,结果让我感到惊讶,这是发生了什么:
结论:简而言之,第三个 table 导致了笛卡尔积,为什么?我希望我知道为什么,您如何看待这个特殊案例?我会感谢你能给我的任何帮助,提前致谢。
好吧,我按照 Icarus 告诉我的做了,我想出了一些有用的东西,你看,我犯了一个大错误,我尝试的数字组合没有 numero_recepcion_permiso
所以输出列是完全空白的,但是当有一个实际的 numero_recepcion_permiso
它显示正确时,无论如何我仍然需要不输出那么多重复行,我该如何解决?感谢大家到目前为止的帮助
首先,确保两个值都存在于两个字段中并且它们实际上匹配,否则可能会生成那么多的重复行,但是重复的行数是我无法判断的,因为我不知道知道你的实际数据是什么,但这可能会稍微解决这个问题
这是解决方案 - 因为你说 numero_recepcion_permiso 是空白的,只需将条件添加到内部联接,以排除空的:
SELECT
dbo_predios.codigo_unico_predio,
dbo_permisos_obras_mayores.numero_permiso_edificacion,
dbo_permisos_obras_mayores.fecha_permiso_edificacion
FROM dbo_predios
INNER JOIN dbo_permisos_obras_mayores ON dbo_predios.codigo_manzana_predio = dbo_permisos_obras_mayores.codigo_manzana_predio AND dbo_predios.codigo_lote_predio = dbo_permisos_obras_mayores.codigo_lote_predio
INNER JOIN dbo_recepciones_obras_mayores ON dbo_permisos_obras_mayores.numero_recepcion_permiso = dbo_recepciones_obras_mayores.numero_recepcion_permiso
AND dbo_recepciones_obras_mayores.numero_recepcion_permiso <>''
WHERE dbo_permisos_obras_mayores.codigo_manzana_predio = 9402 AND dbo_permisos_obras_mayores.codigo_lote_predio = 30
话虽如此,该字段应该允许为空还是 NULL
?也许您需要向 table 添加约束以防止出现这种情况。另一个建议 - 为什么选择 NUMERIC(18,0)
作为那些 table 的主键的数据类型?我更喜欢简单的 INT
或 BIGINT
,也许让数据库为我生成序列。