我对SQL有点新,遇到了以下问题。
我有一个包含公司详细信息的表格,该表格通过enqID加入联系人表格。
在联系表中,有4种不同类型的联系人,可能有也可能没有条目。这些由ctcTypID(1 - 4)
区分我想生成一个包含所有公司记录的查询,以及4种不同类型联系人的联系人名称,所有这些都在一行上。
我认为我可以通过为每个不同的联系人使用子查询来做到这一点,但我似乎无法让它工作,因为我不知道如何编写引用它的父选择子句的子查询select子句(如果你明白我的意思!)
这甚至可能吗?正如我所提到的,我对SQL很陌生,所以请尽量不要嘲笑太多!
谢谢,
史蒂夫
答案 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,无论你使用的是什么)应用程序)。