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
SQL在两个表之间使用_Sql_Db2_Between - Fatal编程技术网

SQL在两个表之间使用

SQL在两个表之间使用,sql,db2,between,Sql,Db2,Between,您好,我想根据另一个表的两列之间的值从表中获取数据,下面SQL应该解释我的目的: SELECT * FROM TABLE 1 WHERE 1.FIELD1 BETWEEN (SELECT 2.RANGE_FROM FROM TABLE 2) AND (SELECT 2.RANGE_TO FROM TABLE 2) 这不起作用,因为我遇到错误: Error: SQL0811N The result of a scalar fullselect, SELECT INTO statement,

您好,我想根据另一个表的两列之间的值从表中获取数据,下面SQL应该解释我的目的:

SELECT * FROM TABLE 1 WHERE 1.FIELD1 BETWEEN 
(SELECT 2.RANGE_FROM FROM TABLE 2) AND (SELECT 2.RANGE_TO FROM TABLE 2)
这不起作用,因为我遇到错误:

Error: SQL0811N  The result of a scalar fullselect, SELECT INTO statement, or VALUES INTO statement is more than one row.  SQLSTATE=21000
 (State:21000, Native Code: FFFFFCD5)
这是显而易见的,因为两个子查询都返回多行。所以我想写一个SQL来执行上面的函数而不出错。 该平台是IBM DB2

编辑

好的,我想我通过使用以下条件连接两个表来解决这个问题:

SELECT * FROM TABLE1 A, TABLE2 B WHERE A.FIELD1 BETWEEN B.RANGE_FROM AND B.RANGE_TO
a.FIELD1 BETWEEN b.RANGE_FROM AND b.RANGE_TO

不过还需要进行更多的测试。

between子句中使用的值应该是标量值。由于子查询返回多行,因此查询失败。尝试细化子查询以仅返回一个结果。为此,首先确定表2中的range_from和range_to的值,如果您的字段介于两者之间。根据您的要求,在子查询中尝试最小范围从和最大范围到,或在何处使用caluse。

BEVERY子句中使用的值应为标量值。由于子查询返回多行,因此查询失败。尝试细化子查询以仅返回一个结果。为此,首先确定表2中的range_from和range_to的值,如果您的字段介于两者之间。根据您的要求,尝试最小范围从和最大范围到,或在子查询中应用where caluse。

我怀疑您想检查table1列值是否在table2(某些行)的2列之间:

这样,您就不会从
表1
中获得重复项,因此不需要使用
DISTINCT

还要注意的是,条件:

SELECT * FROM TABLE1 A, TABLE2 B WHERE A.FIELD1 BETWEEN B.RANGE_FROM AND B.RANGE_TO
a.FIELD1 BETWEEN b.RANGE_FROM AND b.RANGE_TO
相当于:

b.RANGE_FROM <= a.FIELD1  AND  a.FIELD1 <= b.RANGE_TO

b.RANGE\u FROM我怀疑您想检查table1列值是否在table2(某些行)的两列之间:

这样,您就不会从
表1
中获得重复项,因此不需要使用
DISTINCT

还要注意的是,条件:

SELECT * FROM TABLE1 A, TABLE2 B WHERE A.FIELD1 BETWEEN B.RANGE_FROM AND B.RANGE_TO
a.FIELD1 BETWEEN b.RANGE_FROM AND b.RANGE_TO
相当于:

b.RANGE_FROM <= a.FIELD1  AND  a.FIELD1 <= b.RANGE_TO

表1和表2之间有什么关系吗?没有关系。第一个表具有正确的设置值,第二个表包含范围从和范围到值。例如,表1的行值为1000,第二个表的范围从和范围到字段分别为900和1200,那么我的查询应该从表1返回该行。预期结果是什么?按照编写查询的方式,这两个子查询必须只返回一个值。如果
表1的第一行
应与
表2的第一行
相匹配,第二行与另一行相匹配,则必须定义一个关系并
连接这两个表。Re:,如果
A.FIELD1
符合表
B
中的多个范围,这将从
A
返回重复的行。这是您设计时需要牢记的一点(下面由ypercube提供的解决方案避免了此问题)。是的,我将在Select中给出Distinct。表1和表2之间有任何关系吗?没有关系。第一个表具有正确的设置值,第二个表包含范围从和范围到值。例如,表1的行值为1000,第二个表的范围从和范围到字段分别为900和1200,那么我的查询应该从表1返回该行。预期结果是什么?按照编写查询的方式,这两个子查询必须只返回一个值。如果
表1的第一行
应与
表2的第一行
相匹配,第二行与另一行相匹配,则必须定义一个关系并
连接这两个表。Re:,如果
A.FIELD1
符合表
B
中的多个范围,这将从
A
返回重复的行。在您的设计中需要记住这一点(下面由ypercube提供的解决方案避免了这个问题)。是的,我将在Select中给出Distinct。在EXISTS子查询中,在Select列表中输入什么并不重要,因为EXISTS表达式返回TRUE(至少存在1行)或FALSE(甚至不存在1行)。有些人喜欢使用
SELECT*
,有些人喜欢使用
SELECT 1
。我甚至看到了相当混乱的
selectnull
。一些数据库管理系统(Postgres)甚至允许空的选择列表(只是
select
)。无论您使用什么,它对查询结果都没有影响。我建议您使用对您更有意义的任何方法。在EXISTS子查询中,您在选择列表中放置的内容并不重要,因为EXISTS表达式返回TRUE(至少存在1行)或FALSE(甚至不存在1行)。有些人喜欢使用
SELECT*
,有些人喜欢使用
SELECT 1
。我甚至看到了相当混乱的
selectnull
。一些数据库管理系统(Postgres)甚至允许空的选择列表(只是
select
)。无论您使用什么,它对查询结果都没有影响。我建议你使用对你更有意义的东西。