我遇到这种情况很多,我将有一个查询,在连接条件下需要一个表,可能没有条目,因此要求我使用LEFT JOIN。当它与多于1个连接一起使用时,我无法理解语法。
我会:
SELECT A.*, B.*, C.*
FROM A, B, C
WHERE A.id = C.id
AND C.aid = A.id
AND B.cid = C.id
随着D的出现可能会变空,我必须重写查询并遇到问题。
如何简单地将D加入这些表中的任何一个?
答案 0 :(得分:5)
明确指定所有JOIN会更好。这应该会让事情变得更加清晰。
SELECT A.*, B.*, C.*, D.*
FROM A
INNER JOIN C
ON C.aid = A.id
INNER JOIN B
ON B.cid = C.id
LEFT JOIN D
ON C.did = d.id
答案 1 :(得分:1)
以下语法可以帮助您。基本前提是列出的任何表都是必需的LEFT。右边的表(或别名)是可选的。我知道你不太明白,你的语法样本显示(不是要批评),因为你从A加入 - > C和C在不同的字段上回到A.如果在“C”表中两个字段同时指向A的情况下,您将重新加入A作为第二个别名......
select
Want.*,
Maybe.*,
SecondA.*,
B.*
From
A as Want
LEFT JOIN C as Maybe
on Want.ID = Maybe.ID
JOIN A as SecondA
on Maybe.AID = SecondA.ID
JOIN B
on Maybe.ID = B.cID
所以,这个查询表明我想要表A中的所有内容(别名旺旺 - 列表中的左侧/第一个表)无论表C中是否存在匹配(别名为Maybe)ID ID匹配。
注意下一个连接从“C”返回到“A”和表B的第二个实例。我将这些连接作为连接...所以“Maybe”别名和第二个实例之间的关系“A”和“B”是JOIN(必填)。
希望这可以更好地澄清它是如何工作的。
现在,为您的现实生活中的查询。如果您可以描述您正在寻找的内容,以及您的样本表结构/结果预测,那么列表可以为您的需求提供更明确的解决方案。
答案 2 :(得分:1)
我的建议是永远不要在FROM子句上指定多个列。
为清楚起见,总是最好:
示例:
SELECT a.*, b.*, c.*
FROM ATable a
INNER JOIN BTable b
ON b.id = a.id
INNER JOIN CTable c
ON c.id = a.id
WHERE a.someColumn = 'something'
不确定MySQL,但在其他一些SQL版本中,您可以在UPDATES和DELETES上使用相同的内容,例如:
DELETE FROM a
FROM ATable a
INNER JOIN BTable b
ON b.id = a.id
INNER JOIN CTable c
ON c.id = a.id
WHERE a.someColumn = 'something'
或
UPDATE a
SET something = newValue
FROM ATable a
INNER JOIN BTable b
ON b.id = a.id
INNER JOIN CTable c
ON c.id = a.id
WHERE a.someColumn = 'something'
答案 3 :(得分:-1)
希望这会有所帮助
SELECT
A.*, B.*, C.*
FROM A
inner join C on(A.id = C.id)
inner join B on(B.cid = C.id)