Db2 根据某些条件,我们必须改变连接表

Db2 根据某些条件,我们必须改变连接表,db2,Db2,我面临一个问题。我正在创建一个类似Temp_district的程序 因为有这样一个要求,基于某些条件,我们必须更改联接表 like if(year=2016) then select * from table1 a join table2 b on (a.id=b.id) join table3 c on (c.id=b.id) join table4 d on d.id=a.id if(year<>2016) then select * from table1 a join

我面临一个问题。我正在创建一个类似Temp_district的程序

因为有这样一个要求,基于某些条件,我们必须更改联接表

like if(year=2016) then 
select * from table1 a join table2 b  on (a.id=b.id) join table3 c on (c.id=b.id) join table4 d on d.id=a.id


if(year<>2016) then
select * from table1 a join table2 b  on (a.id=b.id) join table3 c on (c.id=b.id) join table5 e on d.id=a.id;

因此,在单个查询中,我可以用temp_table_2016替换表4或表5,这取决于它将从所需的表中获取数据的条件。

因此,只需使用相反的条件连接这两个表:

SELECT t.*,
        COALESCE(t4.col,t5.col) as col,
        COALESCE(t4.col2,t5.col2) as col2,
       ....
FROM t
LEFT JOIN t4 ON(t.id = t4.id AND year = 2016)
LEFT JOIN t5 ON(t.id = t5.id AND year <> 2016)
选择t.*,
合并(t4列,t5列)为列,
结合(t4.col2,t5.col2)为col2,
....
从t
左接t4 ON(t.id=t4.id,年份=2016)
左连接t5 ON(t.id=t5.id和2016年)

您需要在所有表列上添加
COALESCE()
,以便只显示相应的数据。如果您不介意,您可以同时选择它们,其中1个将始终为
NULL

如果您使用MSSQL,您可以这样使用它:

DECLARE @secondtable NVARCHAR(20)

if(year=2016)
BEGIN
SET @secondtable = 'table4'
END

if(year<>2016)
BEGIN
SET @secondtable = 'table5'
END



EXEC('select * from table1 a join table2 b
 on (a.id=b.id) join table3 c on (c.id=b.id) join '+@secondtable+' d on d.id=a.id')
DECLARE@secondtable NVARCHAR(20)
如果(年份=2016年)
开始
SET@secondtable='table4'
结束
如果(2016年)
开始
SET@secondtable='table5'
结束
EXEC('从表1 a选择*加入表2 b
在(a.id=b.id)上连接表3在(c.id=b.id)上连接'+@secondtable+'d在d.id=a.id')

解决方案将取决于您使用的数据库。您在四个不同的数据库系统中遇到了这个问题?我在db2tank中遇到了这个问题,非常感谢您。。。解决方案很好。。。再次感谢您还有一个疑问,如果这个变化表是第一个表,那么它的解决方案是什么。。。plz help.@RameshYelda使用一个虚拟表然后<代码>选择*自(选择1作为虚拟列)虚拟表左连接变化的虚拟表(2016年)。。。2016年12月2日的左连接表…
DECLARE @secondtable NVARCHAR(20)

if(year=2016)
BEGIN
SET @secondtable = 'table4'
END

if(year<>2016)
BEGIN
SET @secondtable = 'table5'
END



EXEC('select * from table1 a join table2 b
 on (a.id=b.id) join table3 c on (c.id=b.id) join '+@secondtable+' d on d.id=a.id')