Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 钻取:由于笛卡尔连接或不等式连接,无法计划此查询_Sql_Outer Join_Apache Drill - Fatal编程技术网

Sql 钻取:由于笛卡尔连接或不等式连接,无法计划此查询

Sql 钻取:由于笛卡尔连接或不等式连接,无法计划此查询,sql,outer-join,apache-drill,Sql,Outer Join,Apache Drill,在Drill中运行上述查询时,我得到了问题中的错误。看起来Drill不喜欢外部联接和OR在条件下的组合 如果我进行内部连接,对虚拟列进行相等性检查的解决方法就足以消除该错误(在我的例子中是JoinHack)。用外部连接是不够的 在查询之前运行以下命令也没有帮助: SELECT * FROM hc LEFT OUTER JOIN n ON hc.JoinHack=n.JoinHack AND (n.`col1` IS NULL OR n.`col1`=hc.`col1`); 这个问题的解决方案或

在Drill中运行上述查询时,我得到了问题中的错误。看起来Drill不喜欢外部联接和OR在条件下的组合

如果我进行内部连接,对虚拟列进行相等性检查的解决方法就足以消除该错误(在我的例子中是
JoinHack
)。用外部连接是不够的

在查询之前运行以下命令也没有帮助:

SELECT *
FROM hc
LEFT OUTER JOIN n
ON hc.JoinHack=n.JoinHack AND (n.`col1` IS NULL OR n.`col1`=hc.`col1`);

这个问题的解决方案或好的解决方法是什么?

您可以尝试
合并

alter session set `planner.enable_nljoin_for_scalar_only` = false;
或者使用
联合

SELECT *
FROM hc
LEFT OUTER JOIN n
  ON hc.JoinHack=n.JoinHack 
  AND COALESCE(n.`col1`,hc.`col1`)=hc.`col1`;

您可以尝试合并

alter session set `planner.enable_nljoin_for_scalar_only` = false;
或者使用
联合

SELECT *
FROM hc
LEFT OUTER JOIN n
  ON hc.JoinHack=n.JoinHack 
  AND COALESCE(n.`col1`,hc.`col1`)=hc.`col1`;
使用派生表

SELECT *
FROM hc
LEFT OUTER JOIN n
  ON hc.JoinHack=n.JoinHack 
  AND n.`col1`=hc.`col1`
UNION
SELECT *
FROM hc
LEFT OUTER JOIN n
  ON hc.JoinHack=n.JoinHack 
  AND n.`col1` IS NULL;
这是总的想法。按原样查询将抛出错误,因为子查询外部不存在n和hc。您可以自己进行排序。

使用派生表

SELECT *
FROM hc
LEFT OUTER JOIN n
  ON hc.JoinHack=n.JoinHack 
  AND n.`col1`=hc.`col1`
UNION
SELECT *
FROM hc
LEFT OUTER JOIN n
  ON hc.JoinHack=n.JoinHack 
  AND n.`col1` IS NULL;

这是总的想法。按原样查询将抛出错误,因为子查询外部不存在n和hc。你可以自己解决这个问题。

这是一个非常复杂的逻辑。我认为这通常相当于:

select * from 
(
SELECT *
FROM hc
LEFT OUTER JOIN n
ON hc.JoinHack=n.JoinHack
) derivedTable
where n.`col1` IS NULL OR n.`col1`=hc.`col1`

这是一个非常复杂的逻辑。我认为这通常相当于:

select * from 
(
SELECT *
FROM hc
LEFT OUTER JOIN n
ON hc.JoinHack=n.JoinHack
) derivedTable
where n.`col1` IS NULL OR n.`col1`=hc.`col1`

Drill接受查询的键是分离左外部联接和包含OR的条件。因此,请使用子查询进行左外部联接,该子查询使用包含或不管您想要多复杂逻辑的条件进行内部联接

SELECT *
FROM hc INNER JOIN
     n
     ON hc.JoinHack = n.JoinHack AND n.`col1` IS NULL
UNION ALL
SELECT *
FROM hc INNER JOIN
     n
     ON hc.JoinHack = n.JoinHack AND n.`col1` = hc.`col1`
UNION ALL
SELECT *
FROM hc LEFT JOIN
     n
     ON hc.JoinHack = n.JoinHack AND n.`col1` = hc.`col1`
WHERE n.JoinHack IS NULL;

Drill接受查询的键是分离左外部联接和包含OR的条件。因此,请使用子查询进行左外部联接,该子查询使用包含或不管您想要多复杂逻辑的条件进行内部联接

SELECT *
FROM hc INNER JOIN
     n
     ON hc.JoinHack = n.JoinHack AND n.`col1` IS NULL
UNION ALL
SELECT *
FROM hc INNER JOIN
     n
     ON hc.JoinHack = n.JoinHack AND n.`col1` = hc.`col1`
UNION ALL
SELECT *
FROM hc LEFT JOIN
     n
     ON hc.JoinHack = n.JoinHack AND n.`col1` = hc.`col1`
WHERE n.JoinHack IS NULL;

“联合”听起来很有前途,也很优雅。不幸的是,Drill抛出了同样的错误。至于UNION,我如何使用更多的条件进行查询,例如:AND(n.
col2
为NULL或n.
col2
=hc.
col2
)等。COALESCE听起来非常有前途和优雅。不幸的是,Drill抛出了同样的错误。至于UNION,我如何使用更多的条件进行查询,例如:AND(n.
col2
为NULL或n.
col2
=hc.
col2
)等。如果必须在更多列上添加更多的条件,例如:AND(n.col2为NULL或n.col2=hc.col2)等,您将如何修改它。@Tom。只能回答你实际提出的问题。当问题被回答(多次,甚至更少)时,你改变问题是不礼貌的。如果您还有其他问题,请以新问题的形式提问,并附上适当的样本数据和期望的结果。我给您+1,以免显得粗鲁,但请注意,当给出一个问题的示例时,为了清晰起见,通常会将其简化为一些简单的问题。作为一个有经验、声誉很高的用户,您很清楚,需要向查询添加更多条件只是时间问题。还要注意的是,Dan的答案比你的答案更能处理这种情况。如果必须在更多列上添加更多条件,例如:AND(n.col2为NULL或n.col2=hc.col2)等,你会如何修改它@Tom。只能回答你实际提出的问题。当问题被回答(多次,甚至更少)时,你改变问题是不礼貌的。如果您还有其他问题,请以新问题的形式提问,并附上适当的样本数据和期望的结果。我给您+1,以免显得粗鲁,但请注意,当给出一个问题的示例时,为了清晰起见,通常会将其简化为一些简单的问题。作为一个有经验、声誉很高的用户,您很清楚,需要向查询添加更多条件只是时间问题。还要注意的是,丹的答案比你的答案更能处理这种情况。我真的希望你的解决方案能奏效。不幸的是,情况并非如此。请注意,在结尾使用WHERE子句时,您可能会过滤掉来自hc的行,如果我们进行外部联接,这些行将被包括在内。我真的希望您的解决方案能够奏效。不幸的是,情况并非如此。注意,在结尾使用WHERE子句时,您可以过滤掉来自hc的行,如果我们进行外部联接,这些行将被包括在内。