SQL 能否通过某一列中的值作为表名,一次性关联查询

img

在做查询的时候,有一列是表名,目前我只能通过在代码先确定了表名,再做关联查询。请问有没有其他办法可以一次性的把结果都搜索出来?

SELECT A.AID,A.VALUE,TB_AENTRY.VALUE_A FROM A
INNER JOIN B ON A.ID_B=B.BID AND B.TABLENAME='TB_A'
INNER JOIN TB_AENTRY ON B.BID=TB_AENTRY.TB_AID
WHERE A.VALUE<>TB_AENTRY.VALUE_A

写过程套个游标循环,用动态sql处理吧,动态sql你想怎么拼就怎么拼

如果数据库是oracle的话

declare
  L_SQL VARCHAR2(4000);
begin
  for REC in (SELECT *
                FROM TABLE(ora_mining_varchar2_nt('TB_A', 'TB_B', 'TB_C'))) LOOP
    L_SQL := L_SQL || 'SELECT B.BID,T.VALUE_' ||
             SUBSTR(REC.COLUMN_VALUE, -1) || ' FROM B ,' ||
             REC.COLUMN_VALUE || ' T WHERE B.BID=T.TB_' ||
             SUBSTR(REC.COLUMN_VALUE, -1) || 'ID' || ' UNION ALL' ||
             CHR(10);
  END LOOP;
  L_SQL := L_SQL || 'SELECT NULL,NULL FROM DUAL WHERE 1=2';
  DBMS_OUTPUT.put_line(L_SQL);

END;
/

输出

SELECT B.BID,T.VALUE_A FROM B ,TB_A T WHERE B.BID=T.TB_AID UNION ALL
SELECT B.BID,T.VALUE_B FROM B ,TB_B T WHERE B.BID=T.TB_BID UNION ALL
SELECT B.BID,T.VALUE_C FROM B ,TB_C T WHERE B.BID=T.TB_CID UNION ALL
SELECT NULL,NULL FROM DUAL WHERE 1=2

另外,你这3个表的BID有没有可能有重复?如果没有重复,建议直接把这3个表union all起来再去关联B表,这样简单得多