2016-04-27 9 views
0

TABLECのすべてのレコードと、TABLEAまたはTABLEBの同等の値を右結合を使用して選択しようとしています。私はMYSQL 5.5.47を使用しています。2つの右結合

--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とTABLEAにTABLEC及びそれと同等の価値のすべてのレコードを選択しようとしているか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に関連する2番目の結合で '='条件を修正しようとしましたが、まだ運がありません。私はここで間違って何をしていますか? NULLの代わりに値 'RAVI'を取得するにはどうすればよいですか?どんな提案も非常に役に立ちます。

+1

が質問に –

+1

テーブルBが与える表は「私をフェッチJOIN RIGHTをあなたの期待される結果を追加完璧に動作しますキーがテーブルBに一致するテーブルA内のすべてのレコードと、テーブルB "のすべての行を返します。したがって、最初の結合ステートメントでは、 tself、idiが6で、idが6のRaviはテーブル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

あなたが「TABLEAまたはTABLEBにTABLEC及びそれと同等の価値のすべてのレコードを選択し、」言ったように、あなたはBとAとCと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の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にはids2と4がありませんので、結果に欠損が生じます。 – Hogan

0

あなたはTABLEC内のすべてのレコードを選択しようとしています右結合を使用した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を持たないため、結果には含まれません。 – Hogan

0

問題はあなたがすべてのIDを含むテーブルを持っていないですrefをしてください。だから1つ作る必要があります。それからあなたは参加することができます。

は、今、私たちは他の人あなたが別のテーブル(TABLEIDを)持っていた場合はもちろん
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 

に参加するために、IDSのこのクエリ/テーブルを使用することができ、このクエリ

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

ですべてのIDを取得しています上のサブクエリの代わりにそれを使用できるすべての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)