问题描述
我需要有关此简单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来防止出现问题。