首页 > 解决方案 > 如何从不相关的表中合并到只有 1 行的 2 个查询结果

问题描述

我有以下表格:

   Table A            Table B
 -------------     -------------
| nameA| numA |   | nameB| numB |
|-------------|   |-------------|
|  A   |   3  |   |  z   |   1  |
|------+------|   |------+------|
|  C   |   9  |   |  w   |   5  |
|------+------|   |------+------|
|  D   |   7  |   |  y   |   3  |
|------+------|   |------+------|
|  B   |   2  |   |  x   |   9  |
|------+------|   |------+------|

我想获取两个表的名称列,其中 num 列中的数字最接近某个数字而无需遍历

我可以轻松地为此独立创建查询,但我不知道如何加入结果。

例如,如果我想要 nameA 其中 numA 最接近 5 而不会超过,而 nameB 其中 numB 最接近 4 而不会超过我将有 2 个以下查询

SELECT nameA FROM TableA WHERE numA < 5 ORDER BY numA LIMIT 1

SELECT nameB FROM TableB WHERE numB < 4 ORDER BY numB LIMIT 1

我想要的结果表是

 ---------------
| nameA | nameB |
|---------------|
|   A   |   y   |
 ---------------

请注意,TableA 有大约 100,000 行,TableB 有大约 1,000,000 行。

标签: sqlpostgresql

解决方案


一种方法只是select在两个查询之前:

select (select a.name
        from a
        where a.numA < 5
        order by a.numA desc
        fetch first 1 row only
       ) a_name,
       (select b.name
        from b
        where b.numB < 5
        order by b.numB desc
        fetch first 1 row only
       ) b_name;

或者把它放在FROM子句中并使用CROSS JOIN

select a.*, b.*
from (select a.name
      from a
      where a.numA < 5
      order by a.numA desc
      fetch first 1 row only
     ) a CROSS JOIN
     (select b.name
      from b
      where b.numB < 5
      order by b.numB desc
      fetch first 1 row only
     ) b

推荐阅读