Sql 跳过不进行比较的连接';这不是真的

Sql 跳过不进行比较的连接';这不是真的,sql,oracle,join,case,where-clause,Sql,Oracle,Join,Case,Where Clause,我正在尝试对两个表执行左联接。在我尝试加入的一个比较中,这个比较只对某些值有效。在SQL中有没有一种方法可以在查看这些特定值时执行比较,否则就跳过比较 以下是我的工作代码: SELECT t1.col1, t1.col2, t1.col3, t1.col4, t1.col5, t1.type, t1.col6, t1.col7, t1.col8, t1.col9, t1.col10, t1.col11, t1.col12, t1.col13, efdt FROM Table1 t1 LEFT

我正在尝试对两个表执行左联接。在我尝试加入的一个比较中,这个比较只对某些值有效。在SQL中有没有一种方法可以在查看这些特定值时执行比较,否则就跳过比较

以下是我的工作代码:

SELECT t1.col1, t1.col2, t1.col3, t1.col4, t1.col5, t1.type, t1.col6, 
t1.col7, t1.col8, t1.col9, t1.col10, t1.col11, t1.col12, t1.col13, efdt
FROM Table1 t1
LEFT JOIN( SELECT col1, col2, col3, col4, MAX(dtcol) as efdt --Left join on aggregated Table2
FROM Table2
GROUP BY col1, col2, col3, col4 ) t2
ON t2.col1 = t1.col1
AND t2.col2 = t1.col2
AND t2.col3 = CASE --There are 6 'types' in Table1
  WHEN t1.type = '1' THEN t1.col6
  WHEN t1.type = '2' THEN t1.col7
  WHEN t1.type = '3' THEN t1.col8
  WHEN t1.type = '4' THEN t1.col9
  WHEN t1.type = '5' THEN t1.col10
  WHEN t1.type = '6' THEN t1.col11 END;
现在我尝试添加第四个比较。但是,此比较仅在
t1.type
'1'
'2'
时存在,因此我希望在
type
不是
'1'
'2'
时跳过比较。以下是我尝试过的一些方法:

AND t2.col4 = CASE
  WHEN t1.type = '1' THEN t1.col12
  WHEN t1.type = '2' THEN t1.col13 END;
t1.type
不等于
'1'
'2'
时,此代码进行编译,但导致
efdt
NULL
,因为它无法加入
表2

AND WHERE t1.type = '1' OR t1.type = '2' THEN t2.col4 = CASE
 WHEN t1.type = '1' THEN t1.col12
 WHEN t1.type = '2' THEN t1.col13 END;
此代码导致“缺少表达式”错误

这段代码可以编译,我真的认为这会起作用。然而,当
t1.type
等于
'1'
'2'
时,这会导致
efdt
NULL
,我不确定原因。这似乎会导致这些行无法连接到
表2


非常感谢您的帮助,谢谢

你的方法不对。我认为如果没有
案例
,这会更简单。相反:

AND
( (t1.type = '1' AND t2.col4 = t1.col12) OR
  (t1.type = '2' AND t2.col4 = t1.col13) OR
  t1.type NOT IN ('1', '2')
)

注意:这假设
t1.type
不是
NULL
(如果需要,可以将该逻辑合并到比较中)。

您的方法错误。我认为如果没有
案例
,这会更简单。相反:

AND
( (t1.type = '1' AND t2.col4 = t1.col12) OR
  (t1.type = '2' AND t2.col4 = t1.col13) OR
  t1.type NOT IN ('1', '2')
)

注意:这假设
t1.type
不是
NULL
(如果需要,可以将该逻辑合并到比较中)。

一些
创建表
DDL和一些
插入
语句以及示例数据将非常有用。但这应该是可行的:

AND ( t2.col4 = CASE
  WHEN t1.type = '1' THEN t1.col12
  WHEN t1.type = '2' THEN t1.col13 END
     OR t1.type NOT IN ('1','2') )
; 
例如:

CREATE TABLE t1 ( type varchar2(1), col1 number,col2 number, col3 number, col4 number, col5 number, col6 number, col7 number, col8 number, col9 number, col10 number, col11 number, col12 number, col13 number );

CREATE TABLE t2 ( col1 number,col2 number, col3 number, col4 number, dtcol DATE );

insert into t1
select to_char(rownum), 1000 + (100*rownum) + 1, 1000 + (100*rownum) + 2, 1000 + (100*rownum) + 3
, 1000 + (100*rownum) + 4, 1000 + (100*rownum) + 5, 1000 + (100*rownum) + 6, 1000 + (100*rownum) + 7
, 1000 + (100*rownum) + 8, 1000 + (100*rownum) + 9, 1000 + (100*rownum) + 10, 1000 + (100*rownum) + 11
, 1000 + (100*rownum) + 12, 1000 + (100*rownum) + 13
from dual
connect by rownum <= 6;

insert into t2 values (1601, 1602, 1611, 9999, SYSDATE);
insert into t2 values (1101, 1102, 1106, 9999, SYSDATE);
insert into t2 values (1101, 1102, 1106, 1112, SYSDATE-5);

SELECT t1.col1, t1.col2, t1.col3, t1.col4, t1.col5, t1.type, t1.col6, 
t1.col7, t1.col8, t1.col9, t1.col10, t1.col11, t1.col12, t1.col13, efdt
FROM t1
LEFT JOIN( SELECT col1, col2, col3, col4, MAX(dtcol) as efdt --Left join on aggregated Table2
FROM t2
GROUP BY col1, col2, col3, col4 ) t2
ON t2.col1 = t1.col1
AND t2.col2 = t1.col2
AND t2.col3 = CASE --There are 6 'types' in Table1
  WHEN t1.type = '1' THEN t1.col6
  WHEN t1.type = '2' THEN t1.col7
  WHEN t1.type = '3' THEN t1.col8
  WHEN t1.type = '4' THEN t1.col9
  WHEN t1.type = '5' THEN t1.col10
  WHEN t1.type = '6' THEN t1.col11 END
AND ( t2.col4 = CASE
  WHEN t1.type = '1' THEN t1.col12
  WHEN t1.type = '2' THEN t1.col13 END
     OR t1.type NOT IN ('1','2') )
; 

请注意,类型6行获得一个非空的
EFDT
,类型1行获得与扩展的(
col4
)条件匹配的
EFDT

一些
创建表
DDL和一些带有示例数据的
INSERT
语句将非常有用。但这应该是可行的:

AND ( t2.col4 = CASE
  WHEN t1.type = '1' THEN t1.col12
  WHEN t1.type = '2' THEN t1.col13 END
     OR t1.type NOT IN ('1','2') )
; 
例如:

CREATE TABLE t1 ( type varchar2(1), col1 number,col2 number, col3 number, col4 number, col5 number, col6 number, col7 number, col8 number, col9 number, col10 number, col11 number, col12 number, col13 number );

CREATE TABLE t2 ( col1 number,col2 number, col3 number, col4 number, dtcol DATE );

insert into t1
select to_char(rownum), 1000 + (100*rownum) + 1, 1000 + (100*rownum) + 2, 1000 + (100*rownum) + 3
, 1000 + (100*rownum) + 4, 1000 + (100*rownum) + 5, 1000 + (100*rownum) + 6, 1000 + (100*rownum) + 7
, 1000 + (100*rownum) + 8, 1000 + (100*rownum) + 9, 1000 + (100*rownum) + 10, 1000 + (100*rownum) + 11
, 1000 + (100*rownum) + 12, 1000 + (100*rownum) + 13
from dual
connect by rownum <= 6;

insert into t2 values (1601, 1602, 1611, 9999, SYSDATE);
insert into t2 values (1101, 1102, 1106, 9999, SYSDATE);
insert into t2 values (1101, 1102, 1106, 1112, SYSDATE-5);

SELECT t1.col1, t1.col2, t1.col3, t1.col4, t1.col5, t1.type, t1.col6, 
t1.col7, t1.col8, t1.col9, t1.col10, t1.col11, t1.col12, t1.col13, efdt
FROM t1
LEFT JOIN( SELECT col1, col2, col3, col4, MAX(dtcol) as efdt --Left join on aggregated Table2
FROM t2
GROUP BY col1, col2, col3, col4 ) t2
ON t2.col1 = t1.col1
AND t2.col2 = t1.col2
AND t2.col3 = CASE --There are 6 'types' in Table1
  WHEN t1.type = '1' THEN t1.col6
  WHEN t1.type = '2' THEN t1.col7
  WHEN t1.type = '3' THEN t1.col8
  WHEN t1.type = '4' THEN t1.col9
  WHEN t1.type = '5' THEN t1.col10
  WHEN t1.type = '6' THEN t1.col11 END
AND ( t2.col4 = CASE
  WHEN t1.type = '1' THEN t1.col12
  WHEN t1.type = '2' THEN t1.col13 END
     OR t1.type NOT IN ('1','2') )
; 
请注意,类型6行获取非null的
EFDT
,类型1行获取与展开(
col4
)条件匹配的
EFDT