在现实生活中使用的笛卡尔连接在哪里?
有人可以在任何SQL数据库中举例说明这样的加入。
答案 0 :(得分:13)
只是随机的例子。你有一张城市表:Id,Lat,Lon,Name。您希望显示从一个城市到另一个城市的距离的用户表。你会写类似
的东西SELECT c1.Name, c2.Name, SQRT( (c1.Lat - c2.Lat) * (c1.Lat - c2.Lat) + (c1.Lon - c2.Lon)*(c1.Lon - c2.Lon))
FROM City c1, c2
答案 1 :(得分:3)
以下是两个例子:
要创建发票或其他单据的多个副本,您可以使用副本名称填充临时表,然后将该表格与实际发票记录相关联。结果集将包含每张发票副本的一条记录,包括要在页面顶部或底部的栏中打印的副本的“名称”或作为水印。使用这种技术,程序可以为用户提供复选框,让他们选择要打印的副本,甚至允许他们打印用户输入副本名称的“特殊副本”。
CREATE TEMP TABLE tDocCopies (CopyName TEXT(20))
INSERT INTO tDocCopies (CopyName) VALUES ('Customer Copy')
INSERT INTO tDocCopies (CopyName) VALUES ('Office Copy')
...
INSERT INTO tDocCopies (CopyName) VALUES ('File Copy')
SELECT * FROM InvoiceInfo, tDocCopies WHERE InvoiceDate = TODAY()
要创建一个日历矩阵,每人每天一条记录,笛卡儿将人员表加入到包含一周,一个月或一年中所有日期的另一个表中。
SELECT People.PeopleID, People.Name, CalDates.CalDate
FROM People, CalDates
答案 2 :(得分:2)
我已经注意到这样做是为了试图故意放慢系统速度,以执行压力测试或缺少开发可交付成果的借口。
答案 3 :(得分:1)
通常,为报告生成超集。
在PosgreSQL
:
SELECT COALESCE(SUM(sales), 0)
FROM generate_series(1, 12) month
CROSS JOIN
department d
LEFT JOIN
sales s
ON s.department = d.id
AND s.month = month
GROUP BY
d.id, month
答案 4 :(得分:0)
您可能希望使用两个查找表中的所有可能组合创建报告,以便为每个可能的结果创建一个包含值的报告。
考虑错误跟踪:您有一个严重性表和另一个优先级表,并且您希望显示每个组合的计数。你最终会得到这样的东西:
select severity_name, priority_name, count(*)
from (select severity_id, severity_name,
priority_id, priority_name
from severity, priority) sp
left outer join
errors e
on e.severity_id = sp.severity_id
and e.priority_id = sp.priority_id
group by severity_name, priority_name
在这种情况下,严重性和优先级之间的笛卡尔联接提供了一个主列表,您可以创建后面的外部联接。
答案 5 :(得分:0)
这是我生命中唯一一次找到笛卡尔积的合法用途。
在我工作的最后一家公司,有一份季度要求的报告,以确定我们所处理的国家网站在每个地理区域使用的常见问题解答。
我们的数据库按元组(4, x)
描述地理区域(市场),其中4
表示层次结构中的级别编号,x
表示唯一的marketId
。< / p>
每个常见问题解答都由FaqId
标识,每个与常见问题解答的关联都由复合键marketId
元组和FaqId
定义。这些关联是通过管理应用程序设置的,但鉴于系统和120个市场中有1000个常见问题解答,每当创建新的FAQ时设置初始关联都是一件麻烦事。因此,我们创建了一个默认的市场选择,并覆盖了marketId
(-1,-1)
元组来表示这一点。
返回报告 - 报告需要显示每个常见问题解答/答案以及在2D矩阵中显示此常见问题解答的市场(我们使用的是Excel电子表格)。我发现在默认市场选择案例中将每个常见问题解答与每个市场相关联的最简单方法是使用此查询,将爆炸结果与所有其他直接常见问题解答 - 市场关联结合起来。
Faq2LevelDefault
表包含所有被定义为默认选择的市场(我相信它只是一个marketIds列表)。
SELECT FaqId, fld.LevelId, 1 [Exists]
FROM Faq2Levels fl
CROSS JOIN Faq2LevelDefault fld
WHERE fl.LevelId=-1 and fl.LevelNumber=-1 and fld.LevelNumber=4
UNION
SELECT Faqid, LevelId, 1 [Exists] from Faq2Levels WHERE LevelNumber=4
答案 6 :(得分:0)
为给定范围内的每个日期运行查询时。例如,对于网站,您可能想知道每天有多少用户在过去N天内处于活动状态。您可以在循环中为每一天运行查询,但最简单的方法是将所有逻辑保留在同一查询中,并且在某些情况下,DB可以优化笛卡尔联接。
答案 7 :(得分:0)
使用相似性函数,例如,在文本挖掘中创建相关单词的列表。编辑距离