2011-03-29 218 views
1

我試圖讓下面的這些規則中的SQL查詢:複雜的SQL查詢

基本上我有2個父表,A和B. B有一個名爲C子表和有一個孩子叫D. 當我從B中選擇一個值時,我從C得到了一個記錄範圍。 這個記錄列表指示我從A中拉出什麼,然後我需要D中所有與從A拉出的記錄相關的信息。

i已經構建了一個查詢,從A獲取記錄,但是在下降到另一個級別時會丟失。

SELECT A.ID 
FROM (A 
INNER JOIN A2 
     ON A.IDV = A2.IDV 
     AND A.Version = A2.CurrentVersion) 
     LEFT JOIN C ON C.LANGUAGE = A.LANGUAGE 
     INNER JOIN B ON C.PARENTID = B.ID 
     WHERE (A2.Enabled = 1) 
     AND (A.NUMBER = 00596205017) 
     AND (B.NAME = 'BLAH'); 

預先感謝

ř

+2

你已經打破你的問題很好下來。一次只寫一步。 B-> C-> A-> d。在每一步之後測試結果集。但是我認爲你是在內心深處反其道而行之,這就是爲什麼你會感到困惑。 – 2011-03-29 11:20:49

+0

斯蒂芬是對的。 SQL的通用表表達式(CTE)是建立這樣的查詢的一種很好的方式。將每一步都表達爲CTE並單獨進行測試。然後添加下一步。以後也會更容易理解! – n8wrl 2011-03-29 11:39:13

回答

4

create table A (AID int) 
create table B (BID int, AID int) 
create table C (CID int, BID int) 
create table D (DID int, AID int) 

數據

insert into A values (1),(2),(3) 
insert into B values (1, 1),(2, 1),(3, 2),(4, 3) 
insert into C values (1, 1),(2, 1),(3, 2),(4, 3) 
insert into D values (1, 1),(2, 1),(3, 2),(4, 3) 

查詢

select D.* 
from A as A 
    inner join D as D 
    on A.AID = D.AID 
where A.AID in (select B.AID 
       from B as B 
        inner join C as C 
        on B.BID = C.BID) 

結果

DID   AID 
----------- ----------- 
1   1 
2   1 
3   2 
+0

用一點點jiggery我設法讓它工作非常感謝! – Roooss 2011-03-29 12:05:05