SQL选择子查询

时间:2009-09-16 09:00:45

标签: sql-server sql-server-2005 select join subquery

我对SQL有点新,遇到了以下问题。

我有一个包含公司详细信息的表格,该表格通过enqID加入联系人表格。

在联系表中,有4种不同类型的联系人,可能有也可能没有条目。这些由ctcTypID(1 - 4)

区分

我想生成一个包含所有公司记录的查询,以及4种不同类型联系人的联系人名称,所有这些都在一行上。

我认为我可以通过为每个不同的联系人使用子查询来做到这一点,但我似乎无法让它工作,因为我不知道如何编写引用它的父选择子句的子查询select子句(如果你明白我的意思!)

这甚至可能吗?正如我所提到的,我对SQL很陌生,所以请尽量不要嘲笑太多!

谢谢,

史蒂夫

3 个答案:

答案 0 :(得分: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 JOIN,因为可能没有匹配,通过这样做,你的查询在性能方面不会非常快 - 但它应该会有效。

马克

答案 1 :(得分: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

答案 2 :(得分:-1)

我认为你正在尝试将SQL用于不适合的东西。 SQL是一种允许您操作和检索数据的语言,您也尝试使用SQL格式化检索数据的输出,我认为您不应该这样做:

您不应该尝试使用SQL格式化(将所有联系人放在一行f.i.)数据。 我的建议是:只使用性能最高的SQL查询从数据库中检索数据,并将输出格式化(将联系人放在同一行)另一种语言(C#,Delphi,PHP,无论你使用的是什么)应用程序)。