簡體   English   中英

參照外鍵聯接兩個表

[英]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上聯接,並使用ParentIDUNION 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM