Sql 跳过不进行比较的连接';这不是真的
我正在尝试对两个表执行左联接。在我尝试加入的一个比较中,这个比较只对某些值有效。在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
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