使用联接时为什么我的SQL查询不起作用?

问题描述

我需要有关此简单SQL查询的帮助,但我不知道问题出在哪里:

SELECT id 
FROM transaction 
JOIN users,link ON transaction.id = link.transaction_id 
                 AND link.user_id = users.id 
WHERE users.id = 2;

运行它时,出现此错误

错误:“交易”附近:语法错误

解决方法

正确使用JOIN,它将起作用:

SELECT id 
FROM transaction JOIN
     link
     ON transaction.id = link.transaction_id  JOIn
     users 
     ON link.user_id = users.id 
WHERE users.id = 2;

您的查询可能还有其他问题,例如id含糊不清,但这不是您要问的问题。

查询的问题是FROM子句中的逗号范围。逗号可防止后面的ON子句看到该表。这是,CROSS JOIN不同的一种方式。

当然,简单的规则和最佳实践是:从不FROM子句中使用逗号。 始终使用正确的,明确的,标准,可读的JOIN语法。

,

假设交易,用户链接为3个单独的表,我从交易表中获取ID,则可以根据需要进行更改。

这是JOIN的正确语法:

SELECT a.id 
FROM transaction a
JOIN users ON transaction.id = link.transaction_id 
JOIN link ON link.user_id = users.id 
WHERE users.id = 2;
,

当我将您的查询重写为

SELECT ID 
  FROM TRANSACTION
  INNER JOIN LINK
    ON TRANSACTION.ID = LINK.TRANSACTION_ID
  INNER JOIN USERS
    ON LINK.USER_ID = USERS.ID
  WHERE USERS.ID = 2

唯一的错误是

ORA-00918: column ambiguously defined

这是因为您在多个表上定义了字段ID。您需要明确标识要返回的ID,如

SELECT TRANSACTION.ID 
  FROM TRANSACTION
  INNER JOIN LINK
    ON TRANSACTION.ID = LINK.TRANSACTION_ID
  INNER JOIN USERS
    ON LINK.USER_ID = USERS.ID
  WHERE USERS.ID = 2

还要注意,LINK和TRANSACTION都是Oracle中的保留字。在这种情况下,它不会引起问题,但在其他情况下,可能会引起问题。最好咨询a list of reserved words and keywords来防止出现问题。

db<>fiddle here