[英]Joining two tables with reference to foreign key
在沒有直接設置外鍵的情況下,連接兩個表存在一些問題。
我有兩個表:
表A
{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指向具有ForeingKey的A.ID2。
我希望有:
{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
有人可以幫助我加入嗎?
試試這個代碼,這是正常工作
SELECT TABLEA.ID,TABLEA.NAME,TABLEB.Code
FROM TABLEA
INNER JOIN TABLEB
ON TABLEA.ID=TABLEB.ID OR TABLEA.Parentid=TABLEB.ID;
您可以首先使用FK
來使所有行都在TableB
上聯接,並使用ParentID
將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
如果您的父子關系可以處於多個級別,那么您需要編寫類似以下內容的遞歸查詢:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.