subquery - 如何使用 FROM 子句中的子查询优化 MariaDB 查询?
问题描述
想象一下这两张桌子。
表 A
ID col1 col2 col3
1 foo baz bar
2 ofo zba rba
3 oof abz abr
表 B
A_ID field_name field_value
1 first Jon
1 last Doe
2 first Adam
2 last Smith
ETC..
现在我想要一个查询(当前的看起来像这样)
SELECT
a.id,
a.col1,
a.col2,
(SELECT field_value FROM B WHERE A_ID = a.id AND field_name = 'first') as first_name,
(SELECT field_value FROM B WHERE A_ID = a.id AND field_name = 'last') as last_name
FROM A a
WHERE (SELECT COUNT(*) FROM B WHERE A_ID = a.id) = 2;
此查询有效。我想要实现的是这样的。
SELECT
a.id,
a.col1,
a.col2,
(SELECT field_value FROM b WHERE b.field_name = 'first') as first_name,
(SELECT field_value FROM b WHERE b.field_name = 'last') as last_name
FROM
A a,
(SELECT field_value, field_name FROM B WHERE A_ID = a.id) b
WHERE (SELECT COUNT(*) FROM b) = 2;
我的方法看起来如何正确?有没有其他方法可以摆脱表B的多个查询?
谢谢!
解决方案
我会用连接替换您的相关子查询:
SELECT
a.id,
a.col1,
a.col2,
b1.field_value AS fv1,
b2.field_value AS fv2
FROM A a
LEFT JOIN B b1
ON a.id = b1.A_ID AND b1.field_name = 'first'
LEFT JOIN B b2
ON a.id = b2.A_ID AND b2.field_name = 'last';
此答案假定来自给定 A 记录的左连接最多只能匹配 B 表中的一条记录,但是,无论如何,这对于您的相关子查询只返回一个值是一个要求。
推荐阅读
- python - 具有需要不同参数集的构造函数的类的类工厂
- amazon-web-services - 即使目标组处于健康状态,Application Load Balancer 的 DNS 也会超时
- node.js - 有没有办法在默认情况下以折叠模式呈现 Loopback 4“/explorer”
- google-apps-script - 当我用谷歌脚本设置单元格的值时,它给了我一个错误
- python - Pyspark 在混合条件下加入
- angular - 使用键值管道访问特定的键/值对
- visual-studio-code - 如何在实时共享期间禁用 Visual Studio Code 中的同步滚动?
- java - 我可以获取设备的指纹扫描仪扫描的指纹图像吗?
- python - 为什么 git OR PyCharm 删除换行符?
- azure - 在 Azure MarketPlace 上的托管应用程序中部署代码和还原数据库的最佳方式