热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

如果我自己联接,为什么INNERJOIN将所有行相乘?

如何解决《如果我自己联接,为什么INNERJOIN将所有行相乘?》经验,为你挑选了1个好方法。

我有一个样本表,加入时打错了字。但这会产生一些我无法理解的结果。您能用简单的英文解释为什么SQL会乘行吗?

我知道如何解决问题:

INNER JOIN @temp tfo
ON t.id_StatiOnDeparture= tfo.id_StationDeparture
    AND t.id_StatiOnDestination= tfo.id_StationDestination
    AND t.id_City = tfo.id_City
    AND t.id_District = tfo.id_District
    AND t.id_Street = tfo.id_Street
    AND t.Amount = tfo.Amount

但是,我真的很想知道为什么会这样。

请不要关闭我的问题

样本数据:

DECLARE @temp TABLE
(   
    id_StationDeparture INT,
    id_StationDestination INT,  
    id_City INT,
    id_District INT,
    id_Street INT,
    Amount DECIMAL(15, 2)
)

INSERT INTO @temp
(
    id_StationDeparture,
    id_StationDestination,
    id_City,
    id_District,
    id_Street,
    Amount
)
VALUES  ( 10, 11, 1, 1, 1, 0)
, ( 12, 14, 1, 1, 0,0)
, ( 16, 18, 1, 1, 0,0)

而我的查询:

SELECT   
  t.id_StationDeparture
, t.id_StationDestination
, t.id_City
, t.id_District
, t.id_Street
, t.Amount
FROM @temp  t
INNER JOIN @temp tfo
ON t.id_StatiOnDeparture= t.id_StationDeparture
    AND t.id_StatiOnDestination= t.id_StationDestination
    AND t.id_City = t.id_City
    AND t.id_District = t.id_District
    AND t.id_Street = t.id_Street
    AND t.Amount = t.Amount

我期望得到以下结果,因为我要加入不同的行:

但是,我得到的是:



1> Lukasz Szozd..:

您需要更改表别名,因为对于不可为空的列t.id_StatiOnDeparture= t.id_StationDeparture,您的条件始终为true,并且工作方式与CROSS JOIN

SELECT   
  t.id_StationDeparture
, t.id_StationDestination
, t.id_City
, t.id_District
, t.id_Street
, t.Amount
FROM @temp  t
INNER JOIN @temp tfo
ON t.id_StatiOnDeparture= tfo.id_StationDeparture
    AND t.id_StatiOnDestination= tfo.id_StationDestination
    AND t.id_City = tfo.id_City
    AND t.id_District = tfo.id_District
    AND t.id_Street = tfo.id_Street
    AND t.Amount = tfo.Amount;

db <> fiddle演示


编辑:

结果集有9行,因为CROSS JOIN它是笛卡尔积,并且3乘以3等于9

集合的基数是集合中元素的数量。输出集的基数等于所有输入集的基数的乘积

| A×B | = | A | ·| B |


@Learner请刷新页面,然后阅读有关笛卡尔乘积的数学概念CROSS JOIN和集合论中的基数的信息。一切都已经提供
推荐阅读
  • 本文探讨了Entity Framework 4(EF4)与SQL Server 2000之间的兼容性问题,并提供了官方反馈链接以供参考。 ... [详细]
  • databasesync适配openGauss使用指导书
    一、database-sync简介database-sync作为一种开源辅助工具,用于数据库之间的表同步,更确切的说法是复制,可以从一个数据库复制表到另一个数据库该工具支持的功能如 ... [详细]
  • 本文档整理了公司内部常用的网站链接和重要资源路径,包括部门周报、内控报销系统、邮件服务等,同时提供了相关数据库的登录信息。 ... [详细]
  • 深入理解Hibernate延迟加载机制
    本文探讨了Hibernate框架中的延迟加载(懒加载)特性,分析其对程序性能的影响及实现原理,同时提供了具体的代码示例来说明如何配置和使用延迟加载。 ... [详细]
  • 1、服务器配置信息① 主服务器IP:192.168.1.2② 从服务器IP:192.168.1.3③ 操作系统:主服务器:Win8,从服务器࿱ ... [详细]
  • 睿智汇海教育致力于培养杰出的IT专业人才,确保学员在就业市场上具备竞争力,助其实现职业成功。我们提供的C#/.Net/Asp.Net培训课程,旨在通过系统的教学和丰富的实践机会,帮助学员掌握最新的技术知识。 ... [详细]
  • 统一幻灯片标题:使用母版功能的技巧
    本文详细介绍了如何通过PowerPoint中的幻灯片母版功能,实现所有幻灯片标题的一致性设置。同时,提供了其他办公软件和编程相关的实用技巧。 ... [详细]
  • MySQL 5.7 绿色版安装及 my.ini 配置详解
    本文主要针对最近因系统重装导致的MySQL配置问题,详细介绍了MySQL 5.7.24绿色解压版的安装步骤及my.ini配置文件的关键设置,帮助用户顺利完成数据库的安装与配置。 ... [详细]
  • 本文介绍如何利用JavaScript在页面加载时为ASP.NET的DropDownList控件设置特定的选项值。 ... [详细]
  • MyBatis入门指南
    本文详细介绍了MyBatis的基础知识,包括如何整合日志框架(如log4j和logback),使用外部JDBC文件,getMapper()方法的应用,以及别名设置等技巧。 ... [详细]
  • 在使用 SQL 语句从数据库中提取数据并尝试将其转换为其他数据类型时,可能会遇到 'java.math.BigDecimal cannot be cast to java.lang.Integer' 错误。本文将详细解释这一错误的原因,并提供有效的解决方案。 ... [详细]
  • 本文探讨了如何利用脚本文件高效管理Oracle数据库,包括脚本文件的创建、编辑及运行方法,旨在为数据库管理人员提供实用指导。 ... [详细]
  • 使用H5在前端生成Excel文件的方法
    本文介绍了一种利用HTML5和JavaScript库在浏览器端直接生成并下载Excel文件的技术方案。通过引入alasql.js和xlsx.core.min.js两个库,可以轻松实现数据导出功能。 ... [详细]
  • 本文介绍了一种方法,用于创建一个包含中文数据的 Employees 表,并确保在 SQL Server 中能够正确显示和处理中文字符。 ... [详细]
  • CentOS 7.6环境下Oracle 11g的数据泵操作与nmon性能监控
    本文详细介绍在CentOS 7.6操作系统中使用Oracle 11g的数据泵(Data Pump)进行数据的导入导出操作,并介绍如何通过nmon工具进行系统性能的监控与分析。 ... [详细]
author-avatar
随缘2012天王_288
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有