两个正确的联合

时间:2016-04-27 04:27:27

标签: mysql sql

我正在尝试使用右连接选择TABLEC中的所有记录及其在TABLEA或TABLEB中的等效值。我使用的是MYSQL 5.5.47。

- 表格数据如下

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

- 使用以下查询并尝试选择TABLEC中的所有记录及其在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

- 我得到以下结果

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

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

5 个答案:

答案 0 :(得分:0)

正如您所说"选择TABLEC中的所有记录及其在TABLEA或TABLEB"中的等效值,因此您需要将C与A和C一起加入B.所以您需要将查询更新为:

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中存在的所有记录。将显示没有值的记录的NULL值,

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

答案 1 :(得分:0)

您正尝试使用右连接选择TABLEC中的所有记录及其在TABLEA或TABLEB中的等效值。因此,表A和表B连接到表c记录。所以我们需要使用Left join(您将获得表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

答案 2 :(得分:0)

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

使用此查询获取所有ID

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的列表,而不是上面的子查询。可能你的模型有这样的表格,但除非你告诉我们,否则我们不会知道。

答案 3 :(得分:0)

  1. 使用此功能完美
  2. 
    
        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)
    
    

答案 4 :(得分: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)