sql - 带有内部连接条件的 SQL 查询
问题描述
上下文是这样的:机器位于某个位置或位于某个位置内的某个位置。我们这里有 2 种情况,机器可以在 positionId 中有一个值,或者如果该位置只有一台机器,它在 positionId 中有 0 作为值。我写了一个查询来返回序列号、名称、地址、描述和标识符的值,同时考虑到存在或不存在位置的情况:
SELECT machine.`serialNumber`, location.`name`, location.`address`, product.`identifier`,
(CASE WHEN EXISTS(SELECT `description`
FROM `positions` AS pos
WHERE pos.`locationId` = `machine`.`id`)
THEN `description`
ELSE 0
END) AS existPos
FROM machine
INNER JOIN location
ON machine.`locationId` = location.`id`
INNER JOIN positions
INNER JOIN product
ON machine.`id` = product.`machineId`
WHERE machine.`id` = 5
结果是多行相同的数据。我在哪里做错了?
解决方案
您可以尝试以下方法:
SELECT
machine.`serialNumber`,
location.`name`,
location.`address`,
product.`identifier`,
(CASE WHEN positions.Id is not null
THEN `description`
ELSE 0
END) AS existPos
FROM
machine
INNER JOIN
location
ON machine.`locationId` = location.`id`
LEFT JOIN
positions
on positions.`Id` = machine.`positionId`
INNER JOIN
product
ON machine.`id` = product.`machineId`
WHERE machine.`id` = 5
推荐阅读
- c# - 带有指向另一个结构的指针的编组结构
- firebase-hosting - 将 React 网站部署到 Firebase 的问题
- javascript - 盖茨比:如何在 head 标签中注入原始 html
- powershell - 制作和显示与命令提示符相同的信息
- python-2.7 - 在 python 中用海龟创建网格
- python - 使用无服务器框架进行本地开发
- python-3.x - 避免调试装饰器,而只调试装饰器
- ios - 如何在 PercentEncoding 中只编码所有特殊字符是 swift 5
- javascript - 使用 JS 删除 facebook 像素 cookie
- typescript - 如何从“导出模块”块导入类型?