从两个表中选择公共列

时间:2019-10-29 11:24:24

标签: sql oracle plsql oracle-sqldeveloper

我有两个桌子

  1. temp_data_holder
  2. temp_data_holder1

这两个表将具有一些公共列,但它们也可能具有仅在一个表中可能存在的一些额外的列。我需要一个查询,该查询将从每个表中选择公用列。

我可以使用以下查询获取公用列名称

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' />
    <title>Change a map's language</title>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v1.4.1/mapbox-gl.js'></script>
    <script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-language/v0.10.1/mapbox-gl-language.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v1.4.1/mapbox-gl.css' rel='stylesheet' />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
    </style>
</head>
<body>

<style>
    #buttons {
        width: 90%;
        margin: 0 auto;
    }
    .button {
        display: inline-block;
        position: relative;
        cursor: pointer;
        width: 20%;
        padding: 8px;
        border-radius: 3px;
        margin-top: 10px;
        font-size: 12px;
        text-align: center;
        color: #fff;
        background: #ee8a65;
        font-family: sans-serif;
        font-weight: bold;
    }
</style>
<div id='map'></div>
<ul id="buttons">
    <li id='button-fr' class='button'>French</li>
    <li id='button-ru' class='button'>Russian</li>
    <li id='button-de' class='button'>German</li>
    <li id='button-es' class='button'>Spanish</li>
</ul>
<script>
mapboxgl.accessToken = 'pk.eyJ1IjoibXVyYWxpcHJhamFwYXRpIiwiYSI6ImNrMHA1d3VjYzBna3gzbG50ZjR5b2Zkb20ifQ.guBaIUcqkTdYHX1R6CM6FQ';
var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/dark-v9',
    center: [16.05, 48],
    zoom: 2.9
});
  mapboxgl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.1.0/mapbox-gl-rtl-text.js');
  var mapboxLanguage = new MapboxLanguage({
  defaultLanguage: 'en'
});
 
map.addControl(mapboxLanguage);
  


document.getElementById('buttons').addEventListener('click', function(event) {
    var language = event.target.id.substr('button-'.length);
    map.setStyle(mapboxLanguage.setLanguage(map.getStyle(), language));
  
});

</script>

</body>
</html>

是否可以使用此查询从每个表中获取结果列?

我要的是这样的东西

Select column_name from all_tab_columns where table_name like 'temp_data_holder' intersect Select column_name from all_tab_columns where table_name like 'temp_data_holder1';

即这些表将位于for循环内,并且每次迭代后结构都会更改,因此我不能简单地对列名进行硬编码

2 个答案:

答案 0 :(得分:0)

通常,您可以使用以下语句从两个表中获取公共列(按名称评估)。

 select listagg(column_name,',') within group (order by column_name)
    from (
      select column_name 
      from user_tab_columns 
      where table_name in (t1,t2) 
      group by column_name having count(*) = 2
    );

结果字符串可用于生成有用的语句,以比较两个表t1和t2

答案 1 :(得分:0)

SQL和PL / SQL是强类型和严格的语言。快速地做事很难。这样可以使应用程序可靠,但是开发人员可以使用更多的自反语言进行学习,以应对这种不灵活的情况。

这是说没有简单的方法可以实现您想要的。您需要将查询汇编为字符串,然后使用动态SQL执行完成的语句。您也将在读取结果集时遇到问题,因为SQL无法处理临时预测。通常,这意味着必须使用Ref Cursor从Java调用代码以映射到JDBC ResultSet。

create or replace function get_data_for_common_cols return sys_refcursor is 

  stmt varchar2(32767) := 'select ';
  rc   sys_refcursor;

begin

  for recs in ( select t.column_name
                      , row_number() over (partition by t.table_name order by t.column_id) as rn
               from user_tab_columns t
                    join user_tab_columns t1 on t1.column_name = t.column_name
               where t.table_name  = 'TEMP_DATA_HOLDER' 
               and   t1.table_name = 'TEMP_DATA_HOLDER1' 
               order by t.column_id)
  loop
    if recs.rn != 1 then
      stmt := stmt || ',';
    end if;
    stmt := stmt || recs.column_name;
  end loop;

  stmt := stmt || ' from TEMP_DATA_HOLDER';

  open rc for stmt;

  return rc;

end;
/

可以将此函数参数化以采用一个表名或两个表名,以供循环查询和汇编语句中使用。这样做留给读者练习:)