2009-09-16 145 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