我想更好地理解“笛卡尔”是什么。以下是从xQbert到a question I asked earlier的答案的引文
当使用左侧(或外部)连接时,您必须考虑数据限制是在何时设置的,还是在创建笛卡尔时。
当我忘记指定连接表的标准时,‘笛卡儿’xQbert指的是‘笛卡尔产品’吗?
发布于 2014-08-07 01:04:33
首先,不要让加入吓倒你,尊重他们。
Select
a.field1,
...
x.field2
from
SomeTable a
JOIN AnotherTable x
on a.SomeKey = x.SomeKey
where
blah...维基百科涉及到各种各样的东西--如果场景和数学引用,等等,我会尝试用更简单的术语来表达。在进行联接时,只需知道所讨论的表之间的“关键”元素是什么。在大多数情况下,它将由一些公共密钥ID (customerID、orderID、itemID等)组成。
所以,从最简单的意义上说,如果你有一个由客户和订单组成的系统,然后做一些类似的事情
select o.orderID, c.CustomerID
from Orders o, Customers c没有加入将导致每一个订单,它将加入到每一个客户。因此,如果你有5个订单和3个客户,你将得到15个条目。
例如:
Orders | Customers
OrderID CustomerID | CustomerID Name
1 A | A Adam
2 B | B Bill
3 C | C Casey
4 B |
5 C | 你会得到
1-A
1-B
1-C
2-A
2-B
2-C
...
5-A
5-B
5-C现在,请注意,两个客户每人有两个订单。由于您知道表之间的公共键,所以您将只获得以下5个条目
select o.orderID, c.CustomerID, c.Name
from
Orders o
JOIN Customers c
on o.CustomerID = c.CustomerID你就会得到所期望的..。
1 A Adam
2 B Bill
3 C Casey
4 B Bill
5 C Casey当进入左联接(或右联接)时,前提仍然成立。始终应用已知的密钥关系。如果它们匹配,伟大(内部连接),如果不是(左连接),那么查询的左侧表中的记录仍将包括在即使没有匹配的右侧。我最近看到了一个联合澄清的例子,并将试图找到它。
现在根据这个基本的解释,考虑在您的系统中有3个表..。每个记录分别有5000、2000和3000条记录。如果在各个表之间不使用联接条件进行查询,则最终会得到30,000,000条记录,而且显然是一团糟。
因此,在编写查询时,我总是尝试以这种方式开始。查看表A中所有需要从表A中获取的表,直到表D中的某个表。我需要查看每个表之间的任何关系,在查询中始终有它们(前提是您需要所有的表)。一旦获得了表,现在得到了所需的所有列,然后考虑所需的条件。它们可以应用在where子句中(通常用于第一个表),但也可以在查询中包含其他别名。但是,这可能有点棘手,特别是在处理左联接时。如果您有适用于其中一个已连接表的特定条件,则可以在该级别添加逻辑“和”条件。
此外,在执行查询时,要养成为长时间命名的表使用别名以简化查询可读性的习惯。此外,在具有多个表的查询中始终限定table.column或alias.column。如果人们试图帮助你,而他们不知道哪一栏是在哪一张桌子上,那就很难理解.更别提在你接管或更新查询之后的人了。
祝好运。
https://stackoverflow.com/questions/25171664
复制相似问题