2009-09-16 140 views
2

我對SQL有點不熟悉,並遇到以下問題。SQL Select子查詢

我有一張關於它的公司詳細信息表,它通過enqID連接到一個聯繫表。

在聯繫人表格中,有4種不同類型的聯繫人可能有或沒有條目。這些區別是由一個ctcTypID(1 - 4)

我想產生一個查詢,其上的所有公司記錄加上一個聯繫人姓名爲每種聯繫的4種不同類型,所有在一行。

我想我可以通過爲每個不同的聯繫人使用子查詢來做到這一點,但我似乎無法得到它的工作,因爲我不知道如何編寫一個引用它的父子選擇子句的子查詢select子句(如果你明白我的意思!)

這甚至可能嗎?正如我所提到的,我對SQL很陌生,所以請儘量不要嘲笑!

感謝,

史蒂夫

+0

對不起,SQL Server 2005. – 2009-09-16 09:58:45

回答

2

喜歡的東西(假設你使用SQL Server 2005和達 - 不幸的是,你沒有提到在您的原帖):

SELECT 
    c.CompanyName, 
    c1.ctcTypID, c1.ContactName, 
    c2.ctcTypID, c2.ContactName, 
    c3.ctcTypID, c3.ContactName, 
    c4.ctcTypID, c4.ContactName 
FROM 
    CompanyTable c 
LEFT OUTER JOIN 
    ContactTable c1 ON c.enqID = c1.enqID AND c1.ctcTypID = 1 
LEFT OUTER JOIN 
    ContactTable c2 ON c.enqID = c2.enqID AND c2.ctcTypID = 2 
LEFT OUTER JOIN 
    ContactTable c3 ON c.enqID = c3.enqID AND c3.ctcTypID = 3 
LEFT OUTER JOIN 
    ContactTable c4 ON c.enqID = c4.enqID AND c4.ctcTypID = 4 

您需要使用LEFT OUTER連接,因爲可能沒有做一個匹配,通過這樣做,你的查詢在性能方面不會非常快 - 但它應該有希望工作。

Marc

+0

謝謝, 我認爲這將做我所需要的。我並不確定語法。 – 2009-09-16 09:45:26

-1

我認爲你正在嘗試使用SQL的東西,它是不適合。 SQL是一種讓您操作和檢索數據的語言,您也嘗試使用SQL來格式化檢索到的數據的輸出,我認爲您不應這樣做:

您不應該嘗試格式(將所有聯繫人放在一行fi上)使用SQL進行數據處理。 我的建議是:使用性能最高的SQL查詢從數據庫中檢索數據,並使用另一種語言(C#,Delphi,PHP,無論您使用哪種語言)格式化輸出(將聯繫人放在同一行)你的申請)。

+0

我覺得你有點苛刻。正如Marc_S所示,將其作爲單個SQL語句編寫是非常簡單的。事實上,單獨的SQL輸出並將其適用於所需的佈局可能會更加煩瑣。 – APC 2009-09-16 09:26:24

+0

在這種情況下,確實可以用一個相當簡單的sql語句。 然而,在其他類似的情況下,我有時會看到人們爲了實現這一點而編寫一個非常複雜和低效的查詢(有時用UDF),所以對我來說,一般規則是:不要使用sql來格式化輸出)。 在這種情況下,只需一個連接語句和一個order by子句就可以用一個簡單的SQL檢索數據,然後可以簡單地對結果進行格式化。 – 2009-09-16 09:58:37

0

這也應該起作用。避免多次加入聯繫人表格。

SELECT 
    CompanyTable.CompanyName, 
    MAX(CASE WHEN ContactTable.ctcTypID = 1 THEN ContactTable.ContactName END) AS ContactName1, 
    MAX(CASE WHEN ContactTable.ctcTypID = 2 THEN ContactTable.ContactName END) AS ContactName2, 
    MAX(CASE WHEN ContactTable.ctcTypID = 3 THEN ContactTable.ContactName END) AS ContactName3, 
    MAX(CASE WHEN ContactTable.ctcTypID = 4 THEN ContactTable.ContactName END) AS ContactName4 
FROM CompanyTable, 
LEFT JOIN ContactTable 
    ON ContactTable.enqID = CompanyTable.enqID AND ContactTable.ctcTypID IN (1,2,3,4) 
GROUP BY 
    CompanyTable.CompanyName