sql - 如何从不相关的表中合并到只有 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 行。
解决方案
一种方法只是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
推荐阅读
- angular - 创建一个单例服务而不需要在 Angular 7 中注入它
- django - 电子邮件模板中的 Django 渲染图像
- dll - 如何使用带有 DLL 的 Automation Anywhere 在 SAP 中获取带有属性的 IDObject?
- reactjs - 在不点击按钮或锚标签的情况下显示语义-ui-react 弹出窗口:React+Typescript
- java - Android:ListView 在 OnClickListener 中不起作用
- apache-kafka - 高扩展性问题:如何跨多个微服务同步数据
- javascript - 返回 NAN 的对象输出
- qt - 有没有办法从文件中读取一行并暂停几秒钟,在暂停期间,函数会检查用户是否输入了相同的单词?
- xml - 名称不能以“?”开头 字符,十六进制值 0x3F
- python - 如何将数据框中的特定值导入熊猫中的变量