Sql 如何在Presto/AWS Athena上进行内部连接?

Sql 如何在Presto/AWS Athena上进行内部连接?,sql,amazon-web-services,presto,amazon-athena,Sql,Amazon Web Services,Presto,Amazon Athena,我正在尝试执行一个查询,以选择位于另一个表中的开始列和结束列定义的范围内的所有行。例如,对于伪代码,如果我有以下(非常小的)表: 我想做一个查询,返回如下内容: group_id position annotation a 2 adfkjdas a 3 sdlfkjasl;kdfj b 9 sdlfkdj c 5 wwlekrj d 27

我正在尝试执行一个查询,以选择位于另一个表中的开始列和结束列定义的范围内的所有行。例如,对于伪代码,如果我有以下(非常小的)表:

我想做一个查询,返回如下内容:

group_id  position  annotation
a         2         adfkjdas
a         3         sdlfkjasl;kdfj
b         9         sdlfkdj
c         5         wwlekrj
d         27        zxcvzx
使用MariaDB/MySQL,中间查询将在范围内按行操作,因此这将起作用:

SELECT
      ranges.group_id as group_id,
      positions.position as position,
      positions.annotation as annotation
    FROM
      (SELECT * FROM my_ranges) AS ranges, positions
    WHERE
      positions.position BETWEEN ranges.start AND ranges.end
也就是说,查询的作用就好像WHERE子句实际上是一系列WHERE子句,由“OR”连接,范围表的每行一个WHERE子句(例如,介于1和5之间、介于7和23之间、介于2和7之间或介于25和29之间)

似乎BETWEEN运算符在presto中的行为不同,因此同一查询不会返回任何结果

在realty中,我的ranges表有大约20000个我想查询的范围,所以通过编写或语句来连接它们似乎是禁止的

这里有人能建议一种方法来修改这个查询(或我的一般方法!)以使用Presto吗

(在回应评论时添加):对于更多的SQL而不是伪代码,我想

use tables like this:
CREATE TABLE IF NOT EXISTS `ranges` (
  `group_id` char,
  `start` int(3),
  `end` int(3)
);

INSERT INTO `ranges` (`group_id`, `start`, `end`) VALUES
  ('a', '2', '5'),
  ('b', '7', '23'),
  ('c', '2', '7'),
  ('d', '25', '29');

CREATE TABLE IF NOT EXISTS `positions` (
  `position` int(3),
  `annotation` varchar(20)
);

INSERT INTO `positions` (`position`, `annotation`) VALUES
  ('2', 'adfkjdas'),
  ('3', 'sdlfkjasl;kdfj'),
  ('5', 'wwlekrj'),
  ('9', 'sdlfkdj'),
  ('27', 'zxcvzx');
并运行如下查询:

SELECT
  group_id,
  position,
  annotation
FROM
  ranges, positions
WHERE
  positions.position BETWEEN ranges.start AND ranges.end

以下几点对我有用。我不得不绕过
end
是一个保留字的事实:

CREATE EXTERNAL TABLE IF NOT EXISTS ranges ( 
  group_id string,
  start_value int,
  end_value int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://my-bucket/ranges/';

CREATE EXTERNAL TABLE IF NOT EXISTS positions ( 
  position int,
  annotation string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://my-bucket/positions/';

SELECT
  group_id,
  position,
  annotation
FROM
  ranges, positions
WHERE
  positions.position BETWEEN ranges.start_value AND ranges.end_value;
范围
位置
目录包含CSV文件:

a,2,5
b,7,23
c,2,7
d,25,29


以下几点对我有用。我不得不绕过
end
是一个保留字的事实:

CREATE EXTERNAL TABLE IF NOT EXISTS ranges ( 
  group_id string,
  start_value int,
  end_value int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://my-bucket/ranges/';

CREATE EXTERNAL TABLE IF NOT EXISTS positions ( 
  position int,
  annotation string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://my-bucket/positions/';

SELECT
  group_id,
  position,
  annotation
FROM
  ranges, positions
WHERE
  positions.position BETWEEN ranges.start_value AND ranges.end_value;
范围
位置
目录包含CSV文件:

a,2,5
b,7,23
c,2,7
d,25,29


我很乐意提供帮助,但要理解您的表数据和要求并不容易。如果可能,请编辑您的问题并在输入表中显示一些行,以便我们可以尝试自己运行查询来测试您的场景。您还可以使用创建示例数据集。谢谢,@JohnRotenstein-这是一个有用的网站!我很乐意提供帮助,但要理解您的表数据和要求并不容易。如果可能,请编辑您的问题并在输入表中显示一些行,以便我们可以尝试自己运行查询来测试您的场景。您还可以使用创建示例数据集。谢谢,@JohnRotenstein-这是一个有用的网站!啊!!保留字!谢谢-我明天早上会试一试的!啊!!保留字!谢谢-我明天早上会试一试的!