【问题标题】:Joining two tables with reference to foreign key参考外键连接两个表
【发布时间】:2015-03-06 17:03:27
【问题描述】:

当没有直接设置外键时,我在连接两个表时遇到了一些问题。

我有两张桌子:

表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

在表 A 中,A.ID3 没有 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

有人可以帮我加入吗?

【问题讨论】:

    标签: mysql sql sql-server


    【解决方案1】:

    如果你的父子关系可以是多个级别的,那么你需要编写一个递归查询,如下所示:

    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);
    

    【讨论】:

      【解决方案2】:

      您可以首先使用FKUNION ALL 将所有要连接到TableB 的行与使用ParentID 连接到TableA 的行:

      样本数据

      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');
      

      查询

      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
      

      【讨论】:

        【解决方案3】:

        试试这个代码,它工作正常

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多