2016-04-27 44 views
0

我想用TABLEC中的所有记录及其在TABLEA或TABLEB中的等价值使用右连接。我正在使用MYSQL 5.5.47。两个右键加入

--Table数据如下

TABLEA   TABLEB  TABLEC 
ID FNAME  ID MNAME ID LNAME 
0 ANOOP  0 N  0 SINGH 
1 BIMA  2 SITA 3 RAJ 
4 CIMI  4 B  5 KUMAR 
6 RAVI  5 A  6 D 

--Using下面的查询,并试图选择表C的所有记录,并在TABLEA或TABLEB

SELECT A.FNAME, B.MNAME, C.LNAME 
FROM TABLEA AS A 
RIGHT JOIN TABLEB AS B ON A.ID = B.ID 
RIGHT JOIN TABLEC AS C ON C.ID = B.ID 

--I我得到它的等值以下结果

ANOOP   N  SINGH     
NULL   NULL RAJ     
NULL   A  KUMAR     
***NULL***  NULL D 

突出显示的值不显示值为'RAVI'inste它在MYSQL 5.5.47中显示NULL。我试图在第二次连接中修改'='条件,这与C & A相关,但仍然没有运气。我在这里做错了什么?如何获得值'RAVI'来代替NULL?任何建议都会非常有帮助。

+1

添加您预期的结果有问题 –

+1

表右连接表B中给出了“给我拿表A中键的所有记录加上表B的所有记录“,所以,在你的第一个连接语句中,我自己,Ravi,其编号为6,其编号为6的编号不在表B中,正在被淘汰。我们如何决定我们需要正确的加入? –

+0

你在寻找一个完整的外连接吗?或者你想只保留以姓氏形式出现的记录吗? –

回答

0
DROP TABLE IF EXISTS table_a; 
DROP TABLE IF EXISTS table_b; 
DROP TABLE IF EXISTS table_c; 

CREATE TABLE table_a 
(id INT NOT NULL PRIMARY KEY 
,fname VARCHAR(12) NULL 
); 

INSERT INTO table_a VALUES 
(0,'ANOOP'), 
(1,'BIMA'), 
(4,'CIMI'), 
(6,'RAVI'); 

CREATE TABLE table_b 
(id INT NOT NULL PRIMARY KEY 
,mname VARCHAR(12) NULL 
); 

INSERT INTO table_b VALUES 
(0,'N'), 
(2,'SITA'), 
(4,'B'), 
(5,'A'); 

CREATE TABLE table_c 
(id INT NOT NULL PRIMARY KEY 
,lname VARCHAR(12) NULL 
); 

INSERT INTO table_c VALUES 
(0,'SINGH'), 
(3,'RAJ'), 
(5,'KUMAR'), 
(6,'D'); 

SELECT a.fname 
     , b.mname 
     , c.lname 
    FROM table_c c 
    LEFT 
    JOIN table_a a 
    ON a.id = c.id 
    LEFT 
    JOIN table_b b 
    ON b.id = c.id; 
+-------+-------+-------+ 
| fname | mname | lname | 
+-------+-------+-------+ 
| ANOOP | N  | SINGH | 
| NULL | NULL | RAJ | 
| NULL | A  | KUMAR | 
| RAVI | NULL | D  | 
+-------+-------+-------+ 
4 rows in set (0.02 sec) 
0

至于你说的“选择表C的所有记录,并在TABLEA或TABLEB同等价值”,所以你需要加入具有A和C与B的C所以你需要更新你的查询为:

SELECT A.FNAME, B.MNAME, C.LNAME 
FROM TABLEC AS C RIGHT JOIN TABLEB AS B 
    ON B.ID = C.ID 
RIGHT JOIN TABLEA AS A 
    ON C.ID = A.ID 

如果你想在A,B和C存在空值将显示为不具有值的记录中的所有记录,

SELECT A.FNAME, B.MNAME, C.LNAME 
FROM (
TABLEA AS A 
LEFT JOIN TABLEB AS B ON B.ID = A.ID 
) 
RIGHT JOIN TABLEC AS C ON (C.ID = B.ID 
OR B.ID = NULL 
OR A.ID = C.ID) 
WHERE 1 
+0

表c没有id 2和4,所以这些将在结果中丢失。 – Hogan

0

您试图选择表C的所有记录以及使用右连接在TABLEA或TABLEB中的等价值。所以表A和B连接到表c记录。所以我们需要使用左连接(您将获得表C和表A和B的常见记录的所有记录)。更多信息请参考此link

SELECT 
    ifnull(A.FNAME,""), 
    ifnull(B.MNAME,""), 
    ifnull(C.LNAME,"") 
FROM 
    TABLEA AS A 
LEFT JOIN 
    TABLEB AS B 
ON 
    A.ID = B.ID 
LEFT JOIN 
    TABLEC AS C 
ON 
    C.ID = B.ID 
+0

表a没有id 2和5,因此结果中将缺少id 2和5。 – Hogan

0

的问题是你没有包含所有的ID的表。所以你必须做一个。然后你可以加入。

获取所有的IDS与此查询

SELECT ID FROM TABLEA 
UNION 
SELECT ID FROM TABLEB 
UNION 
SELECT ID FROM TABLEC 

现在我们可以使用IDS的这个查询/表加入其他

SELECT A.FNAME, B.MNAME, C.LNAME 
FROM (
    SELECT ID FROM TABLEA 
    UNION 
    SELECT ID FROM TABLEB 
    UNION 
    SELECT ID FROM TABLEC 
) I 
LEFT JOIN TABLEA A ON I.ID = A.ID 
LEFT JOIN TABLEB B ON I.ID = B.ID 
LEFT JOIN TABLEC C ON I.ID = C.ID 

当然,如果你有另一个表(TABLEID),其有一个你可以使用的所有ID的列表,而不是上面的子查询。这可能是你的模型有这样一张桌子,但除非你告诉我们,否则我们不会知道。

-2

尝试......

SELECT A.FNAME, B.MNAME, C.LNAME 
FROM TABLEC AS c 
LEFT JOIN TABLEA AS a ON c.ID=a.ID 
JOIN TABLEB AS b ON c.ID=b.ID; 
+0

哇 - 内部加入TABLEB - 大胆移动。 – Hogan

0
  1. 使用此作品完美


    SELECT A.FNAME, B.MNAME, C.LNAME 
    FROM TABLEC AS C 
    LEFT JOIN TABLEA AS A ON (A.ID = C.ID) 
    LEFT JOIN TABLEB AS B ON (B.ID = C.ID)