SQL中的LEFT OUTER连接问题

时间:2012-09-29 11:50:46

标签: sql teradata

我的代码看起来像这样:

select t1.colId, t1.col1, t1.col2, t1.col3, count(t2.colId)
from table1 t1 left outer join

(select colId from db1.tb90) t2 
on t1.colId = t2.colId
group by 1,2,3,4

我想从t1复制所有行,t2应该在匹配的地方加入。

但是,t1.colId可以包含重复项,并希望存在这些重复项。

我当前的问题是select语句在t1.colId上执行不同的操作,因此我获得了不同t1.colId的数量,而不是包含重复项。

问题是on t1.colId = t2.colId

2 个答案:

答案 0 :(得分:1)

你问:问题是on t1.colId = t2.colId吗?答案是,不是,问题出在group by。尝试通过子查询中的colId进行聚合:

select t1.colId, t1.col1, t1.col2, t1.col3, n
from table1 t1 left outer join    
   (select colId, count(*) as n 
    from db1.tb90 group by colId) t2 
on t1.colId = t2.colId

编辑DUE OP评论

好的,这里some data to understand your question

create table table1 (
  colId int,
  col1 int,
  col2 int,
  col3 int
);

create table tb90 (
  colId int
);

insert into table1 values
( 1,1,1,1),
( 1,1,1,1),
( 2,2,2,2);

insert into tb90 values
(1),
(1),
(3);

您的查询结果:

select t1.colId, t1.col1, t1.col2, t1.col3, count(t2.colId)
from table1 t1 left outer join
(select colId from tb90) t2 
on t1.colId = t2.colId
group by 1,2,3,4;

| COLID | COL1 | COL2 | COL3 | COUNT(T2.COLID) |
------------------------------------------------
|     1 |    1 |    1 |    1 |               4 |
|     2 |    2 |    2 |    2 |               0 |

我的查询结果:

select t1.colId, t1.col1, t1.col2, t1.col3, n
from table1 t1 left outer join    
   (select colId, count(*) as n 
    from tb90 group by colId) t2 
on t1.colId = t2.colId

| COLID | COL1 | COL2 | COL3 |      N |
---------------------------------------
|     1 |    1 |    1 |    1 |      2 |
|     1 |    1 |    1 |    1 |      2 |
|     2 |    2 |    2 |    2 | (null) |

现在,写出快速的结果。

答案 1 :(得分:0)

鉴于以下数据:

CREATE TABLE table1
(
    colID   INTEGER NOT NULL,
    col1    INTEGER NOT NULL,
    col2    INTEGER NOT NULL,
    col3    INTEGER NOT NULL,
    PRIMARY KEY(colID, col1, col2, col3)
);
INSERT INTO table1 VALUES(1, 1, 1, 1);
INSERT INTO table1 VALUES(1, 2, 1, 1);
INSERT INTO table1 VALUES(1, 1, 2, 1);
INSERT INTO table1 VALUES(1, 1, 1, 2);
INSERT INTO table1 VALUES(2, 2, 1, 1);
INSERT INTO table1 VALUES(2, 1, 2, 1);
CREATE TABLE db1.tb90
(
    colID   INTEGER NOT NULL,
    col4    INTEGER NOT NULL,
    PRIMARY KEY(ColID, Col4)
);
INSERT INTO db1.tb90 VALUES(1, 1);
INSERT INTO db1.tb90 VALUES(1, 2);
INSERT INTO db1.tb90 VALUES(1, 3);
INSERT INTO db1.tb90 VALUES(1, 4);
INSERT INTO db1.tb90 VALUES(1, 5);

您的查询:

SELECT t1.colId, t1.col1, t1.col2, t1.col3, COUNT(t2.colId)
  FROM table1 t1
  LEFT OUTER JOIN (SELECT colId FROM db1.tb90) t2 
    ON t1.colId = t2.colId
 GROUP BY 1, 2, 3, 4;

产生输出:

colid   col1    col2    col3    (count)
1       1       1       1       5
1       1       1       2       5
1       1       2       1       5
1       2       1       1       5
2       1       2       1       0
2       2       1       1       0

在Mac OS X 10.7.5上针对IBM Informix Dynamic Server 11.70.FC2运行时。

如果这是Teradata为相同数据提供的答案,那么查询计划执行重复消除的事实不是探测;答案是对的。如果这不是Teradata为相同数据提供的答案,那么Teradata可能存在一个错误(IMNSHO,尽管我必须谨慎地对其他人的DBMS进行诽谤,因为我在IBM的Informix上工作)。

如果我误解了问题,那么请提供示例表模式和值以及实际和预期输出,以便我们可以更清楚地查看发生的情况。您可能也想提供解释输出。


请注意,您可以将查询重写为:

SELECT t1.colId, t1.col1, t1.col2, t1.col3, t2.colId_count
  FROM table1 t1
  JOIN (SELECT t3.colID, COUNT(*) AS colId_count
          FROM (SELECT DISTINCT colID FROM table1) AS t3
          LEFT JOIN db1.tb90 AS t4 ON t3.colId = t4.colId
         GROUP BY t3.colID
       ) t2
    ON t1.colId = t2.colId;

你可以看到在这个重新制定中table1上有一个DISTINCT操作; Teradata可能会自动为您进行转换。