具有内部联接条件的SQL查询
上下文是这样的:机器位于某个位置或某个位置内的某个位置。我们这里有两种情况,机器可以在positionId中有一个值,或者如果该位置仅容纳一台机器,则在positionsId中有0作为一个值。 我编写了一个查询来返回serialNo、name、address、dscript和identifier的值,并考虑了存在或不存在位置的情况:具有内部联接条件的SQL查询,sql,phpmyadmin,Sql,Phpmyadmin,上下文是这样的:机器位于某个位置或某个位置内的某个位置。我们这里有两种情况,机器可以在positionId中有一个值,或者如果该位置仅容纳一台机器,则在positionsId中有0作为一个值。 我编写了一个查询来返回serialNo、name、address、dscript和identifier的值,并考虑了存在或不存在位置的情况: SELECT machine.`serialNumber`, location.`name`, location.`address`, product.`ident
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
我猜你正在使用MySQL。如前所述 在MySQL中,连接、交叉连接和内部连接是语法等价物(它们可以相互替换)。在标准SQL中,它们不是等价的。内部联接与ON子句一起使用,否则使用交叉联接 这意味着您的
内部连接位置实际上是交叉连接,因为没有ON子句。这就是为什么会有重复的行。如果您还从位置
表中选择一些列,您将看到其中的差异
此外,由于机器位于某个位置或某个位置内部的某个位置
,因此不应将内部联接用于位置
和位置
。在您的代码中,一旦location
内部连接,没有locationId
-FK的机器都将丢失。若这不是您所期望的,那个么两个表都应该通过左连接进行连接
LEFT JOIN location
ON machine.`locationId` = location.`id`
LEFT JOIN positions
ON machine.`positionId` = positions.`id`
还有一件对我来说很奇怪的事情是其中pos.locationId=machine.id
。您在上面提供的图表中没有描述这种关系。我猜您可能想将其更改为,其中pos.id=machine.positionId