我是SQL的新手,遇到了以下问题。
我有一个表,上面有公司的详细信息,它是通过enqID连接到联系人表的。
在contact表中,有4种不同类型的联系人,它们可能有条目,也可能没有条目。它们由ctcTypID (1 - 4)区分
我想要生成一个查询,其中包含所有公司记录,以及4种不同类型联系人中每种类型的联系人姓名,所有这些都在一行上。
我想我可以通过对每个不同的联系人使用子查询来做到这一点,但我似乎不能让它工作,因为我不知道如何写一个引用其父select子句的子查询select子句(如果您明白我的意思!)
这有可能吗?正如我已经提到的,我是SQL的新手,所以请尽量不要嘲笑太多!
谢谢,
史蒂夫
发布于 2009-09-16 01:08:26
例如(假设您使用的是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
您需要使用左外部连接,因为可能不存在匹配,通过这样做,您的查询在性能方面不会太快-但它应该可以工作。
Marc
发布于 2009-12-09 06:15:15
这也应该是可行的。避免在contact表上多次联接。
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
发布于 2009-09-16 01:06:36
我认为您正在尝试将SQL用于一些不是为它而设计的东西。SQL是一种允许您操作和检索数据的语言,您还试图使用SQL来格式化检索到的数据的输出,我认为您不应该这样做:
您不应尝试格式化(将所有联系人放在一行f.i.)用SQL查询数据。我的建议是:只需使用性能最好的SQL-query从数据库中检索数据,并使用另一种语言(C#、Delphi、PHP,无论您的应用程序使用哪种语言)格式化输出(将联系人放在同一行上)。
https://stackoverflow.com/questions/1431809
复制相似问题