2016-04-27 2 views
0

Я пытаюсь выбрать все записи в 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» inste ad показывает NULL в MYSQL 5.5.47. Я попытался изменить условие '=' во втором соединении, связанном с C & A, но все равно не повезло. Что я здесь делаю неправильно? Как получить значение «RAVI» вместо NULL? Любое предложение было бы очень полезно.

+1

добавить свой ожидаемый результат в вопросе –

+1

Таблица A RIGHT JOIN таблица B дает «за мной все записи в таблице A, чьи ключи совпадают в таблице B, плюс возвращают мне все строки таблицы B ". Итак, в вашем первом заявлении о соединении i сам, Рави, идентификатор которого равен 6 и чей id, 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

Как вы сказали «выбрать все записи в TABLEC и эквивалентное значение в TABLEA или TableB», так что вам нужно, чтобы присоединиться к С с А и С с 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 
+0

таблица c не имеет идентификаторов 2 и 4, поэтому в результате этого будет отсутствовать. – Hogan

0

вы пытаетесь выбрать все записи в TABLEC и его эквивалентное значение в TABLEA или TABLEB, используя правое соединение. Таким образом, таблицы A и B объединяются в таблицу c records. Поэтому нам нужно использовать 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 
+0

Таблица a не имеет идентификаторов 2 и 5, поэтому в результате этого будет отсутствовать. – Hogan

0

Проблема в том, вы не имеете таблицу, содержащую все идентификаторы. Поэтому вы должны это сделать. Тогда вы можете присоединиться к этому.

Получить все идентификаторы с этим запросом

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

Теперь мы можем использовать этот запрос/таблицу идентификаторов, чтобы присоединиться к другим

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), что был список всех идентификаторов, которые вы могли бы использовать, вместо указанного выше запроса. Возможно, у вашей модели такой стол, но мы не узнаем, если вы не скажете нам.

-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

wow-- внутреннее соединение на 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)