问题标签 [cross-join]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
59013 浏览

c# - 如何使用 LINQ to SQL 执行 CROSS JOIN?

如何使用 LINQ to SQL 执行 CROSS JOIN?

0 投票
3 回答
4407 浏览

sql - SQL Server 2005 中的大规模交叉连接

我正在移植一个创建CROSS JOIN两个表的 MASSIVE 的进程。结果表包含 15m 条记录(看起来该过程与 2600 行表和 12000 行表进行 30m 交叉连接,然后进行一些必须将其分成两半的分组)。行相对较窄 - 只有 6 列。它已经运行了5个小时,没有完成的迹象。我只是注意到已知商品和我对交叉连接的期望之间的计数差异,所以我的输出没有分组或重复数据删除,这将使决赛桌减半 - 但这似乎仍然不会完成任何时间很快。

首先,如果可能的话,我将寻求从流程中消除该表 - 显然它可以通过单独加入两个表来替换,但现在我无法看到它使用的其他任何地方。

但是鉴于现有的流程可以做到(在更短的时间内,在功能不太强大的机器上,使用 FOCUS 语言),是否有任何选项可以提高CROSS JOINSQL Server(2005)中大 s 的性能(硬件不是真正的选项,这个盒子是 64 位 8 路 32 GB RAM)?

细节:

它是在 FOCUS 中以这种方式编写的(我试图产生相同的输出,它是 SQL 中的 CROSS JOIN):

所以所需的输出实际上是一个 CROSS JOIN (它从每一侧加入一个空白列)。

在 SQL 中:

使用 SQL 代码:

根据随后如何使用此表,它应该能够从流程中消除,只需加入用于构建它的两个原始表即可。但是,这是一个非常大的移植工作,我可能有一段时间找不到表的用法,所以我想知道是否有任何技巧可以CROSS JOIN及时 ing 像这样的大表(特别是考虑到现有的流程in FOCUS 能够更快地做到这一点)。这样我就可以验证我构建替换查询的正确性,然后用视图或其他方式将其分解。

我还在考虑将 UDF 和字符串操作分解并首先执行 CROSS JOIN 以稍微分解该过程。

到目前为止的结果:

事实证明,UDF 确实对性能有很大贡献(负面)。但是 15m 行交叉连接和 30m 行交叉连接之间似乎也存在很大差异。我没有 SHOWPLAN 权限(嘘),所以我无法判断它使用的计划在更改索引后是更好还是更差。我还没有重构它,但我希望整个表很快就会消失。

0 投票
1 回答
3355 浏览

sql - 与包含值的 nn 表交叉连接(枢轴)

我有 3 张桌子:

MyValue 的行仅在提供实际值时创建。

我希望我的结果以表格方式显示,如:

我已经成功创建了一个交叉连接:

或者,在 linq 中:

并了解如何在 linq 中创建一个支点(此处此处):

(假设 MyDatas 是具有上一个查询结果的视图):

但我想找到一种方法来创建一个结果集,如果可能的话,Month1, ... 属性是动态的。

注意:导致 n+1 查询的解决方案:

0 投票
7 回答
29336 浏览

sql - SQL INNER JOIN 语法

下面的两位 SQL 得到相同的结果

我已经看到这两种风格在不同的公司都被用作标准。据我所见,第二个是大多数人在网上推荐的。除了风格之外,还有什么真正的原因吗?使用 Inner Join 有时会有更好的性能吗?

我注意到 Ingres 和 Oracle 开发人员倾向于使用第一种风格,而 Microsoft SQL Server 用户倾向于使用第二种风格,但这可能只是巧合。

感谢您的任何见解,我一直想知道这个问题。

编辑:由于我使用了不正确的术语,我已将标题从“SQL 内连接与笛卡尔积”更改。感谢您迄今为止的所有回复。

0 投票
8 回答
15881 浏览

sql-server - sql cross join - 有人发现它有什么用处?

今天,在使用 sql server 开发 10 年来,我第一次在生产查询中使用了交叉联接。我需要将结果集填充到报告中,并发现使用创造性 where 子句在两个表之间进行交叉连接是一个很好的解决方案。我想知道有人在交叉连接的生产代码中发现了什么用途?

更新:Tony Andrews 发布的代码与我使用交叉连接的代码非常接近。相信我,我理解使用交叉连接的含义并且不会轻易这样做。我很高兴终于使用了它(我真是个书呆子)——有点像我第一次使用完全外连接的时候。

感谢大家的回答!这是我使用交叉连接的方式:

0 投票
3 回答
6894 浏览

sql - 混合隐式和显式 JOIN

我遇到了 Hibernate 生成无效 SQL 的问题。具体来说,混合和匹配隐式和显式连接。这似乎是一个开放的错误

但是,我不确定为什么这是无效的 SQL。我想出了一个生成相同语法异常的小玩具示例。

架构

数据

工作 SQL

这两个查询都有效。我意识到有一个笛卡尔积;这是故意的。

显式连接:

隐式连接:

无效的 SQL

此查询不适用于 MSSQL 2000/2008 或 MySQL:

在 MS2000 中,我收到错误:

列前缀“e1”与查询中使用的表名或别名不匹配。

在 MySQL 中,错误是:

“on 子句”中的未知列“e1.managerEmployeeID”。

问题)

  1. 为什么这个语法无效?
  2. 奖励:有没有办法强制 Hibernate 只使用显式 JOIN?

0 投票
2 回答
469 浏览

sql - 这些交叉连接是否会给我带来问题?

我有一个穷人的复制设置,我无能为力。来自 a 的一些标识数据(基本上是主键)call_table通过简单的触发器复制到另一个表中,然后“复制服务器”运行存储过程将数据从队列表复制到 #temp 表(以防止 SQL 中的锁定) 6.5是给我的情况)。call_table最后,查询使用临时表中的关键数据将数据从使用此查询拉回复制服务器:

每天晚上清理一次队列表,然后重新开始。在对此进行调查时,隐式交叉连接向我扑来(我站在他们通常是邪恶的一边),但后来我读到了交叉连接的力量。我在这里是因为我不太相信。假设 temp 表一天有大约 10,000 行,call_table 到目前为止一个月有大约 100,000 行。这个查询将如何工作?它是否将这两个表混合在一起,总共有 1,000,000,000 个内存,然后使用 group 子句将其修剪下来?你能解释一下 SQL 编译结果的步骤吗?

执行计划:

0 投票
2 回答
887 浏览

sql-server-2005 - SQL Server 交叉连接在 where 语句中带有条件的性能比较以及内部连接在连接的 on 语句中带有条件的性能比较

我正在尝试确定在 SQL Server 2005 中运行的一段生成的 SQL 的性能。

它使用 CROSS JOINS,但绑定交叉连接表的条件位于 where 语句中。

我以前认为所有具有 where 语句的交叉连接都会首先提取完整的笛卡尔积,然后应用过滤器。

但是,MSDN 上的以下链接建议不同。

https://msdn.microsoft.com/en-us/library/ms190690.aspx

它特别指出,如果交叉连接表上有条件,它将像内部连接一样“表现”。它继续展示了一个内部连接和带条件的交叉连接的类似结果的示例。

它没有说明性能差异是什么,只是它们的行为方式相似。

0 投票
2 回答
3399 浏览

sql - 自联接、交叉联接和分组

我有一个来自多个来源的温度样本表,我想在设定的时间间隔内找到所有来源的最低、最高和平均温度。乍一看,这很容易做到:

但是,如果来源进出而不是在有问题的时间间隔内忽略丢失的来源,事情会变得更加复杂(到了我被难住的地步!)我想使用来源的最后知道的温度来寻找失踪样品。在不均匀分布的样本中使用日期时间和构建间隔(比如每分钟)会使事情变得更加复杂。

我认为应该可以通过在样本表上进行自联接来创建我想要的结果,其中第一个表的时间大于或等于第二个表的时间,然后计算分组的行的聚合值来源。但是,我对如何实际执行此操作感到困惑。

这是我的测试表:

为了进行最小值、最大值和平均值计算,我需要一个如下所示的中间表:

以下查询使我接近我想要的,但它采用源的第一个结果的温度值,而不是给定时间间隔内的最新结果:

更新: chadhoc(顺便说一句,好名字!)提供了一个很好的解决方案,不幸的是它在 MySQL 中不起作用,因为它不支持FULL JOIN他使用的。幸运的是,我相信一个简单UNION的替代方法是有效的:

更新 2:EXPLAIN MySQL为 chadhoc 的代码提供以下输出:

我能够让查尔斯的代码像这样工作:

它的解释是:

0 投票
5 回答
8330 浏览

postgresql - 更快的 CROSS JOIN 替代方案 - PostgreSQL

我正在尝试 CROSS JOIN 两个表,客户和项目,因此我可以按客户逐项创建销售报告。我有 2000 个客户和 2000 个项目。

SELECT customer_name FROM customers; --Takes 100ms

SELECT item_number FROM items; --Takes 50ms

SELECT customer_name, item_number FROM customers CROSS JOIN items; Takes 200000ms

我知道这是 400 万行,但是有可能让它运行得更快吗?我想最终加入这样的销售表:

SELECT customer_name, item_number, sales_total FROM customers CROSS JOIN items LEFT JOIN sales ON (customer.customer_name = sales.customer_name, item.item_number=sales.item_number);

销售表显然不会包含所有客户或所有商品,因此这里的目标是生成一份报告,显示所有客户和所有商品以及已售出和未售出的商品。

我正在使用 PostgreSQL 8.4