如何在不使用多个子查询的情况下使用多列选择多行

Posted

技术标签:

【中文标题】如何在不使用多个子查询的情况下使用多列选择多行【英文标题】:How do I select multiple rows using multiple columns without using multiple subqueries 【发布时间】:2020-09-01 12:29:06 【问题描述】:

我有以下疑问:

SELECT name, modelName, color, rarity, slot, power, chapter
FROM items
WHERE items.id = (SELECT head FROM characterdata WHERE steamid = ?)
OR items.id = (SELECT leftHand FROM characterdata WHERE steamid = ?)
OR items.id = (SELECT rightHand FROM characterdata WHERE steamid = ?)
OR items.id = (SELECT feet FROM characterdata WHERE steamid = ?);

它必须执行四次完全相同的查询,这似乎是不好的做法。我怎样才能重写它,让它只使用两个查询,也就是只需要获取一次字符数据?

【问题讨论】:

【参考方案1】:

你可以使用exists:

SELECT name, modelName, color, rarity, slot, power, chapter
FROM items i
WHERE EXISTS (SELECT 1
              FROM characterdata cd
              WHERE cd.steamid = ? AND
                    i.id IN (cd.head, cd.leftHand, cd.rightHand, cd.feet)
             );

这假定? 始终具有相同的值。

如果不是,你可以这样表达:

SELECT name, modelName, color, rarity, slot, power, chapter
FROM items i
WHERE EXISTS (SELECT 1
              FROM characterdata cd
              WHERE (cd.steamid = ? AND i.id = cd.head) OR
                    (cd.steamid = ? AND i.id = cd.leftHand) OR
                    (cd.steamid = ? AND i.id = cd.rightHand) OR
                    (cd.steamid = ? AND i.id = cd.feet)
             );

【讨论】:

以上是关于如何在不使用多个子查询的情况下使用多列选择多行的主要内容,如果未能解决你的问题,请参考以下文章

如何在不破坏SQL逻辑的情况下将JOINS转换为子查询

子查询(MySQL)

Oracle-子查询实例

Python QTableView |如何在不按住 Ctrl 的情况下通过单击选择多行?

如何在不使用 _id 字段但使用多个属性的情况下在 mongoose 中查找子文档

如何在不使用 Join 的情况下处理引用其他表的相关子查询的问题