2016-01-08 93 views
0

我有兩個表:如何通過連接兩個表來編寫查詢?

表1:

ID NAME 
1  ID1 
2  ID2 
3  ID3 
4  ID4 
5  ID5 
6  ID6 
7  ID7 

表2:

Parent_ID Child_ID 
    1   2 
    2   5 
    2   3 
    3   6 

如何編寫一個查詢得到下面的輸出,如果我在狀態分配PARENT_ID = 1 ?

P_ID NAME Is_Group Selected 
1  ID1  Yes   No 
2  ID2  Yes   Yes 
3  ID3  Yes   Yes 
4  ID4  No   No 
5  ID5  No   Yes 
6  ID6  No   Yes 
7  ID7  No   No 

所以,輸出主要包含來自表1的記錄,但它也需要有兩個額外的列。

如果表1中的ID存在於表2的Parent_ID列中,則Is_Group列中的值應該爲「Yes」。如果表1中的ID存在於表2中的Child_ID列中,則選定列中的值應爲「yes」,並且Parent_ID = 1(如交叉引用)。

此外,我需要檢查一個Child_ID是否有任何交叉引用。例如,在表2中,Parent_Id 1的Child_ID爲2,2的Child_Id的值爲5和3,因此我需要將Id的3和5的選定列值設置爲「是」,依此類推。

在此先感謝您的答覆。對不起我的英語不好。

+0

它知道你在實際使用該RDBMS是很重要的,因爲你有兩個'mysql'和'SQL-server'標籤 – JamieD77

+0

這樣做是對的常用方法使用遞歸分層查詢,但是用於這樣做的方法在數據庫之間變化很大。對於SQL Server,您可以使用[遞歸CTE](https://technet.microsoft.com/en-us/library/ms186243(v = sql.105).aspx)來執行此操作。對於MySQL,你通常必須[寫一個存儲過程](http://stackoverflow.com/questions/16513418/how-to-do-the-recursive-select-query-in-mysql)。 –

+0

感謝您的回覆。我需要在sql-server中。我會嘗試使用遞歸CTE來獲得所需的輸出。 – user2502961

回答

0

這應該給你你需要的輸出。

它使用遞歸cte來獲取層次結構。

然後外連接到CTE兩次,以確定該ID是一個集團,或者通過檢查空選定值

WITH cte AS 
( 
    SELECT Parent_ID, 
      Child_ID 
    FROM Table2 
    WHERE Parent_ID = 1 
    UNION ALL 
    SELECT t2.Parent_ID, 
      t2.Child_ID 
    FROM Table2 t2 
      INNER JOIN cte ON t2.Parent_ID = cte.Child_ID 
) 
SELECT DISTINCT 
     t1.*, 
     (CASE WHEN grp.Parent_ID IS NULL THEN 'No' 
       ELSE 'Yes' 
      END) AS Is_Group, 
     (CASE WHEN sel.Parent_ID IS NULL THEN 'No' 
       ELSE 'Yes' 
      END) AS Selected 
FROM Table1 t1 
     LEFT JOIN cte grp ON t1.ID = grp.Parent_ID 
     LEFT JOIN cte sel ON t1.ID = sel.Child_ID 

,你從表1中選擇的一切不管它是否是事實在選定的層次結構中,對於任何是Parent_ID的ID,但不包含在層次結構中的Is_Group,都會給出No。要始終確定一個ID是否是一個組,只需將表格2作爲grp而不是cte ..就可以了。

;WITH cte AS 
( 
    SELECT Parent_ID, 
      Child_ID 
    FROM Table2 
    WHERE Parent_ID = 1 
    UNION ALL 
    SELECT t2.Parent_ID, 
      t2.Child_ID 
    FROM Table2 t2 
      INNER JOIN cte ON t2.Parent_ID = cte.Child_ID 
) 
SELECT DISTINCT 
     t1.*, 
     (CASE WHEN grp.Parent_ID IS NULL THEN 'No' 
       ELSE 'Yes' 
      END) AS Is_Group, 
     (CASE WHEN sel.Parent_ID IS NULL THEN 'No' 
       ELSE 'Yes' 
      END) AS Selected 
FROM Table1 t1 
     LEFT JOIN Table2 grp ON t1.ID = grp.Parent_ID 
     LEFT JOIN cte sel ON t1.ID = sel.Child_ID 
0

試試這個,

select distinct id, t.NAME, 
    case when t1.Parent_ID is not null then 'Yes' else 'No' end Is_Group 
    ,case when b.Child_ID is null then 'No' else 'Yes' end Selected 
    from Table1 t left join Table2 t1 on t.ID =t1.Parent_ID 
     outer apply (select Child_ID from Table2 a where a.Child_ID=t.ID) b 
相關問題