2015-03-06 2 views
1

У меня есть некоторые проблемы с объединением двух таблиц, если внешний ключ не установлен напрямую.Соединение двух таблиц со ссылкой на внешний ключ

У меня есть две таблицы:

ТАБЛИЦА А

{A.ID} {A.NAME} {Parentid} {A_FK} (foreign key) 
A.ID1 A.NAME1 NULL   A_FK1 
A.ID2 A.NAME2 NULL   A_FK2 
A.ID3 A.NAME3 A.ID2   NULL 
A.ID4 A.NAME4 NULL   A.FK4 
OtherA OtherId Other   Other 

Таблица B

{B.ID} {B.Code}  
A.FK1 some_text1 
A.FK2 some_text2 
A.FK4 some_text3 
B.ID1 some_text4 

В таблице AAID3 не имеет FK, но она имеет ParentId, которые указывают на A.ID2, который имеет ForeingKey.

Я хотел бы ожидать:

{A.ID} {A.NAME} {B.Code} 
A.ID1 A.NAME1 some_text1 
A.ID2 A.NAME2 some_text2 
A.ID3 A.NAME3 some_text2 
A.ID4 A.NAME4 some_text3 

Может кто-нибудь помочь мне с этим присоединиться?

ответ

0

Если родитель-потомок может иметь несколько уровней, то вам нужно написать рекурсивную что-то запрос, как это:

CREATE TABLE TableA(ID INT, Name VARCHAR(10), ParentID INT NULL, FK INT NULL); 
CREATE TABLE TableB(ID INT, Code VARCHAR(50)); 
INSERT INTO TableA VALUES (1, 'Name1', NULL, 1); 
INSERT INTO TableA VALUES (2, 'Name2', NULL, 2); 
INSERT INTO TableA VALUES (3, 'Name3', 2, NULL); 
INSERT INTO TableA VALUES (4, 'Name4', NULL, 4); 
INSERT INTO TableA VALUES (5, 'Name4', 3, NULL); 

INSERT INTO TableB VALUES (1, 'Some Text 1'); 
INSERT INTO TableB VALUES (2, 'Some Text 2'); 
INSERT INTO TableB VALUES (4, 'Some Text 3'); 

WITH X (ID, NAME, FK) AS (
    SELECT ID, NAME, FK 
    FROM TABLEA 
    WHERE PARENTID IS NULL 
    UNION ALL 
    SELECT T.ID, T.NAME, X.FK 
    FROM TABLEA T 
    INNER JOIN X ON (T.PARENTID = X.ID) 
) 
SELECT X.ID, X.NAME , TABLEB.CODE 
FROM X INNER JOIN TABLEB ON (X.FK = TABLEB.ID); 
0

Попробуйте этот код, это работает правильно

SELECT TABLEA.ID,TABLEA.NAME,TABLEB.Code 
FROM TABLEA 
INNER JOIN TABLEB 
ON TABLEA.ID=TABLEB.ID OR TABLEA.Parentid=TABLEB.ID; 
0

Вы могли бы сначала получить все строки должны быть соединены на TableB с помощью FK и UNION ALL их рядами должны быть соединены на TableA с помощью ParentID:

ОБРАЗЕЦ ДАННЫХ

CREATE TABLE TableA(
    ID   INT, 
    Name  VARCHAR(10), 
    ParentID INT NULL, 
    FK   INT NULL 
) 
CREATE TABLE TableB(
    ID  INT, 
    Code VARCHAR(50) 
) 
INSERT INTO TableA VALUES 
(1, 'Name1', NULL, 1), 
(2, 'Name2', NULL, 2), 
(3, 'Name3', 2, NULL), 
(4, 'Name4', NULL, 4); 
INSERT INTO TableB VALUES 
(1, 'Some Text 1'), 
(2, 'Some Text 2'), 
(4, 'Some Text 3'); 

QUERY

SELECT 
    a.ID, a.Name, b.Code 
FROM TableA a 
INNER JOIN TableB b ON a.FK = b.ID 
WHERE a.ParentID IS NULL 

UNION ALL 

SELECT 
    a1.ID, a1.Name, b.Code 
FROM TableA a1 
INNER JOIN TableA a2 ON a2.ID = a1.ParentID 
INNER JOIN TableB b ON a2.FK = b.ID 
WHERE a1.FK IS NULL 
ORDER BY ID 

РЕЗУЛЬТАТ

ID   Name  Code 
----------- ---------- ------------------- 
1   Name1  Some Text 1 
2   Name2  Some Text 2 
3   Name3  Some Text 2 
4   Name4  Some Text 3 
Смежные вопросы