具有内部联接条件的SQL查询

具有内部联接条件的SQL查询,sql,phpmyadmin,Sql,Phpmyadmin,上下文是这样的:机器位于某个位置或某个位置内的某个位置。我们这里有两种情况,机器可以在positionId中有一个值,或者如果该位置仅容纳一台机器,则在positionsId中有0作为一个值。 我编写了一个查询来返回serialNo、name、address、dscript和identifier的值,并考虑了存在或不存在位置的情况: SELECT machine.`serialNumber`, location.`name`, location.`address`, product.`ident

上下文是这样的:机器位于某个位置或某个位置内的某个位置。我们这里有两种情况,机器可以在positionId中有一个值,或者如果该位置仅容纳一台机器,则在positionsId中有0作为一个值。 我编写了一个查询来返回serialNo、name、address、dscript和identifier的值,并考虑了存在或不存在位置的情况:

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