【问题标题】:HOw can i overcome The SQL query exceeded the maximum number of joins. The allowed limit is 5 error我该如何克服 SQL 查询超出了最大连接数。允许的限制是 5 错误
【发布时间】:2019-09-11 04:34:35
【问题描述】:

我写了一个查询来获取客户,如下所示。

SELECT customer
FROM catalog join industry in catalog.Industy  
join category in industry.Category   
join Subcategory in category.Subcategory
join product in Subcategory.Product
join MethodOfPreparation in product.MethodOfPreparation 
join customer in MethodOfPreparation.Customer 

但是,我得到了以下错误

SQL 查询超出了最大连接数。允许的限制是 5

我该如何解决这个问题。请任何人帮助我?

【问题讨论】:

  • 也许你可以使用一个临时表来存储一些连接,see here
  • 您的JOIN 语句缺少ON 子句。也许这就是问题所在,而不是JOINs 的数量。
  • 如果没有收到请给我样品
  • 我在 cosmos db 中执行这个查询,我可以在那里使用临时表

标签: azure-cosmosdb


【解决方案1】:

在 cosmos db SQL 查询中不能使用这样的临时表。根据这个official blog,暂时不会增加上限。

我建议你拆分查询SQL或调整数据结构。毕竟,过多的连接次数也会降低查询效率。

当然,您可以提交反馈here 以改进 COSMOS DB 的功能。


例如,我的数据如下:

{
    "id": "1",
    "a": [
        {
            "b": [
                {
                    "c": [
                        {
                            "d": [
                                {
                                    "e": [
                                        {
                                            "f": [
                                                {
                                                    "g": "AAA"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

为了避免超过 5 次连接时间,我的 SQL 可能如下所示:

SELECT e.f
FROM root r
join a in r.a  
join b in a.b   
join c in b.c
join d in c.d
join e in d.e 

如果您想查询e.f 中的子属性(因为您的SQL 是MethodOfPreparation.Customer),您可以在存储过程中循环结果以将项目放入输出数组中。


更新:

如果要最后过滤customer.id,建议先用普通SQL查询customer数组:

SELECT MethodOfPreparation.customer
FROM catalog join industry in catalog.Industy  
join category in industry.Category   
join Subcategory in category.Subcategory
join product in Subcategory.Product
join MethodOfPreparation in product.MethodOfPreparation 

然后在cosmos db中使用代码循环存储过程中的数组:

var returnArray = [];
for(var i=0;i<feed.length;i++){

   var customer = feed[i];
   //to judge if id meets the filter condition
   if(id==???){
      returnArray.push(customer);
   }
}

【讨论】:

  • 如何拆分查询?请有任何想法
  • @iamthiru 我的意思是,例如,您可以在存储过程中查询带有 5 个连接的 sql,然后使用代码循环查询结果以获取每个项目中的 customer
  • @iamthiru 是的,f 是数组。然后不能使用sql,使用代码循环结果并将每个f.id添加到输出数组中。这是我的想法。
  • @iamthiru 无论如何,我的话是你不能在一个查询中实现你的所有需求。您可以使用sql加代码来组合最终结果。
  • @iamthiru 当然,有任何问题,请告诉我。
【解决方案2】:

尝试使用 SQL 视图 这将有助于加入更多的表以及返回更多的列。

创建视图 [dbo].[CustomerView] AS 选择第 1 列,第 2 列,... FROM 表名 WHERE 条件;

【讨论】:

    【解决方案3】:

    不,您不能在单个查询中使用超过 5 个联接,如 microsoft docs 中所述。请找到此链接以获取更多信息。 LINK

    现在您可以通过将它们划分为子查询来优化您的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 2018-02-12
      • 2019-02-24
      相关资源
      最近更新 更多