Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Redshift SQL JOIN对于一个ID的行为不同,并且当谓词中有多个ID时行为不同?_Sql_Join_Amazon Redshift - Fatal编程技术网

Redshift SQL JOIN对于一个ID的行为不同,并且当谓词中有多个ID时行为不同?

Redshift SQL JOIN对于一个ID的行为不同,并且当谓词中有多个ID时行为不同?,sql,join,amazon-redshift,Sql,Join,Amazon Redshift,我无法共享数据和表的详细信息,因此为了复制这个问题,这里是带有示例数据的测试表。表“table1”共有14行,其中“column1”值“id1”的行数为10行,ID“id2”的行数为12行,其中有8行。 “table2”中的“column1”值“id1”和“id2”各有一行 注:该问题在这些测试表中不可再现。事实上,在重新创建我看到这个问题的实际表之后,我得到了正确的联接结果。 目前,我认为红移的背后发生了一些变化,因为我看到了这个问题。我会在听到更多信息后更新 CREATE TABLE IF

我无法共享数据和表的详细信息,因此为了复制这个问题,这里是带有示例数据的测试表。表“table1”共有14行,其中“column1”值“id1”的行数为10行,ID“id2”的行数为12行,其中有8行。 “table2”中的“column1”值“id1”和“id2”各有一行

注:该问题在这些测试表中不可再现。事实上,在重新创建我看到这个问题的实际表之后,我得到了正确的联接结果。 目前,我认为红移的背后发生了一些变化,因为我看到了这个问题。我会在听到更多信息后更新

CREATE TABLE IF NOT EXISTS table1 (
column1 varchar(255) encode lzo,
t1column2 varchar(255) encode lzo,
t1column3 varchar(255) encode lzo,

PRIMARY KEY(column1))
distkey(column1)
sortkey(column1);

COMMIT;

----------------------------------

CREATE TABLE IF NOT EXISTS table2 (
column1 varchar(255) encode lzo,
t2column2 varchar(255) encode lzo,
t2column3 varchar(255) encode lzo,
);

COMMIT;

----------------------------------

insert into table1 values
('id1', '0', 'a'),
('id1', '0', 'a'),
('id1', '0', 'a'),
('id1', '0', 'a'),
('id1', '1', 'a'),
('id1', '1', 'a'),
('id1', '2', 'a'),
('id1', '3', 'a'),
('id1', '4', 'a'),
('id1', '5', 'a'),
('id1', '6', 'a'),
('id1', '7', 'a'),
('id1', '8', 'a'),
('id1', '9', 'a'),
('id2', '0', 'a'),
('id2', '0', 'a'),
('id2', '1', 'a'),
('id2', '2', 'a'),
('id2', '3', 'a'),
('id2', '4', 'a'),
('id2', '5', 'a'),
('id2', '6', 'a'),
('id2', '7', 'a'),
('id2', '7', 'a'),
('id2', '7', 'a'),
('id2', '7', 'a');

-------------------------

insert into table2 values
('id1', null, 'pqr'),
('id2', null, 'xyz'),
案例1:具有2个ID的查询每列1值提供1行,即“id1”和“id2”。在这里,我希望'id1'有10行,'id2'有8行

select distinct t1.column1, t1.t1column2, t1.t1column3, t2.t2column2, t2.t2column3 
from table1 t1
join table2 t2 
on t1.column1=t2.column1
where t1.column1 IN ('id1', 'id2');
案例2:当仅使用1个值“id1”执行相同的查询时,会按预期给出正确的10个唯一行

select distinct t1.column1, t1.t1column2, t1.t1column3, t2.t2column2, t2.t2column3 
from table1 t1
join table2 t2 
on t1.column1=t2.column1
where t1.column1 IN ('id1');

删除了案例3和案例4以避免混淆。

首先在表上设置主键约束是错误的,因为我们知道该主键字段不会有唯一的值,即使我们认为红移不会以相同的方式对外部或唯一的键约束进行强制

在ETL期间,需要确保加载到主键列中的数据是唯一的,否则不应将此类列定义为主键

如果我们只更改为查询(primary key column上的trim()),它将返回正确的结果,因为在这种情况下,我们将强制优化器忽略主键

原因我们以前没有看到这个问题,因为在我的案例1中,查询优化器没有考虑主键

最近,在三月底的一次红移更新中,查询优化器开始更多地利用主键来提高查询性能,这是问题开始之后的事情


因此,在我的例子中,解决方案是删除表上的主键约束,查询保持不变。

注释不用于扩展讨论;此对话已被取消。您的数据可能重复违反了您的限制。Redshift使用的查询算法假设它们没有。因此,您的查询结果就是碰巧产生的任何垃圾。在这些条件和信任结果下,不能使用红移。请参见重复链接中的答案。声明描述数据的约束。PS你还没有修复我在聊天评论中提到的不清楚和错误的语言。