我一直使用INNER JOIN和LEFT OUTER JOIN.但是,我似乎永远不需要RIGHT OUTER JOIN.
我已经看到很多讨厌的自动生成的SQL使用正确的连接,但对我来说,这段代码是不可能的.我总是需要使用内部和左侧连接重写它来制作它的头部或尾部.
有没有人真正使用Right连接编写查询?
Pet*_*ros 25
这取决于您放置每个表的连接的哪一侧.
如果要返回左表中的所有行,即使右表中没有匹配项,也可以使用左连接.
如果要从右表中返回所有行,即使左表中没有匹配项,也使用右连接.
有趣的是,我很少使用正确的连接.
Mar*_*ith 24
举一个RIGHT JOIN
可能有用的例子.
假设人,宠物和宠物配件有三个表.人们可以选择宠物,这些宠物可以选择配件
CREATE TABLE Persons
(
PersonName VARCHAR(10) PRIMARY KEY
);
INSERT INTO Persons
VALUES ('Alice'),
('Bob'),
('Charles');
CREATE TABLE Pets
(
PetName VARCHAR(10) PRIMARY KEY,
PersonName VARCHAR(10)
);
INSERT INTO Pets
VALUES ('Rover',
'Alice'),
('Lassie',
'Alice'),
('Fifi',
'Charles');
CREATE TABLE PetAccessories
(
AccessoryName VARCHAR(10) PRIMARY KEY,
PetName VARCHAR(10)
);
INSERT INTO PetAccessories
VALUES ('Ball', 'Rover'),
('Bone', 'Rover'),
('Mouse','Fifi');
Run Code Online (Sandbox Code Playgroud)
如果要求获得结果列出所有人,无论他们是否拥有宠物,以及他们拥有的任何宠物的信息也有配件.
这不起作用(不包括鲍勃)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
ON P.PersonName = Pt.PersonName
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName;
Run Code Online (Sandbox Code Playgroud)
这不起作用(包括Lassie)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
ON P.PersonName = Pt.PersonName
LEFT JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName;
Run Code Online (Sandbox Code Playgroud)
这确实有效(但语法很少被理解,因为它需要ON
连续两个子句来实现所需的逻辑连接顺序)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName
ON P.PersonName = Pt.PersonName;
Run Code Online (Sandbox Code Playgroud)
总而言之,最容易使用的是 RIGHT JOIN
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Pets Pt
JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName
RIGHT JOIN Persons P
ON P.PersonName = Pt.PersonName;
Run Code Online (Sandbox Code Playgroud)
虽然如果决定避免这种情况,那么另一个选择是引入一个可以保持连接的派生表
SELECT P.PersonName,
T.PetName,
T.AccessoryName
FROM Persons P
LEFT JOIN (SELECT Pt.PetName,
Pa.AccessoryName,
Pt.PersonName
FROM Pets Pt
JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName) T
ON T.PersonName = P.PersonName;
Run Code Online (Sandbox Code Playgroud)
SQL Fiddles:MySQL,PostgreSQL,SQL Server
您通常使用RIGHT OUTER JOINS在其他表中查找孤立项.
归档时间: |
|
查看次数: |
3592 次 |
最近记录: |