我在重构的旧系统中有以下SQL语句。这是此问题的缩写视图,只是暂时返回count(*)。
SELECT COUNT(*)
FROM Table1
INNER JOIN Table2
INNER JOIN Table3 ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2
ON Table1.DifferentKey = Table3.DifferentKey
它会生成大量记录并杀死系统,但是有人可以解释其语法吗?可以用其他任何方式表达吗?
编辑:
建议重新格式化
SELECT COUNT(*)
FROM Table1
INNER JOIN Table3
ON Table1.DifferentKey = Table3.DifferentKey
INNER JOIN Table2
ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2
为了提高可读性,我重新构造了查询…从表1的最顶层开始,然后将其绑定到Table3,然后将table3绑定到table2。如果遵循关系链,则容易遵循得多。
现在,回答您的问题。笛卡尔积的结果是,您得到的数量很大。对于表1中与表3匹配的每个记录,您将得到X
*Y。然后,对于表3和表2之间的每个匹配将具有相同的影响… Y * Z …因此,对于表1中仅一个可能的ID的结果可以有X * Y * Z记录。
这是基于不知道您的表的规范化或内容如何…键是否为PRIMARY键。
Ex:
Table 1
DiffKey Other Val
1 X
1 Y
1 Z
Table 3
DiffKey Key Key2 Tbl3 Other
1 2 6 V
1 2 6 X
1 2 6 Y
1 2 6 Z
Table 2
Key Key2 Other Val
2 6 a
2 6 b
2 6 c
2 6 d
2 6 e
因此,在这种情况下,表1与表3的连接将得到12条记录(每1条记录与3条记录中的每条联接)。然后,再次返回表2中的每个匹配记录(5条记录)…总共60(3
tbl1 * 4 tbl3 * 5 tbl2)计数。
因此,现在,根据您的1000条记录进行扩展,您会看到混乱的结构如何使母牛(扼要说话)窒息并降低性能。
SELECT
COUNT(*)
FROM
Table1
INNER JOIN Table3
ON Table1.DifferentKey = Table3.DifferentKey
INNER JOIN Table2
ON Table3.Key =Table2.Key
AND Table3.Key2 = Table2.Key2
我试图在一个视图中加入3个表;情况是这样的: 我有一张表格,里面有申请住在这所大学校园的学生的信息。我有另一个表,列出了每个学生的霍尔偏好(其中3个)。但是这些首选项中的每一个仅仅是一个ID号,而该ID号在第三个表中有一个对应的Hall名称(没有设计这个数据库……)。 基本上,我在表上有和它们的首选项以及它们的信息,结果类似于... 其中将是。所以现在我要将与第三个表匹配,其中该表包含和。 所以,
问题内容: 好的,这是。我有两个表:product和product_sizes 所以基本上我的产品表具有id(主键),名称(产品名称)和size_id(product_sizes中的外键) 我的product_sizes表具有预定值: 在这里,我有一个有效的代码来显示产品表(使用while代码以html格式): 我的问题是我想显示(用html表示)尺寸名称而不是其size_id,类似于以下示例:
我有4个表,和
我对Hibernate不太熟悉。谁能帮我解决代码中出现的错误。 我正在使用Eclipse Helios,Hibernate 3 生成的类和配置文件,如: Emp.java 部门java hibernate.cfg.xml Emp.hbm.xml 部门hbm。xml Test.java 我得到的例外是: 线程“main”组织中出现异常。冬眠HibernateException:无法分析配置:/hib
问题内容: 我在两个表之间有多对多关系。 表包含我的餐厅。 表包含不同的类别。 表包含两列,每列分别包含两个表的ID。 以下陈述是我能想到的,但没有给我我想要的输出。 我希望输出是有关餐厅的信息,并在最后一列中是类别的连接行。 问题答案: 要串联值,可以使用。xml路径解决方案有误,应使用和特殊字符。 您也可以使用变量解决方案
问题内容: 显式内部连接与隐式内部连接是否存在效率差异?例如: 与 问题答案: 在性能方面,它们是完全相同的(至少在SQL Server中)。 PS:请注意,自SQL Server 2005起不赞成使用该语法。(仍支持问题中使用的语法) 弃用“旧样式” JOIN语法:只是部分事情