首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL选择子查询

SQL选择子查询
EN

Stack Overflow用户
提问于 2009-09-16 09:00:45
回答 3查看 565关注 0票数 2

我是SQL的新手,遇到了以下问题。

我有一个表,上面有公司的详细信息,它是通过enqID连接到联系人表的。

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

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

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

这有可能吗?正如我已经提到的,我是SQL的新手,所以请尽量不要嘲笑太多!

谢谢,

史蒂夫

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-16 09:08:26

例如(假设您使用的是SQL Server 2005及更高版本-不幸的是,您在最初的帖子中没有提到这一点):

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2009-12-09 14:15:15

这也应该是可行的。避免在contact表上多次联接。

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2009-09-16 09:06:36

我认为您正在尝试将SQL用于一些不是为它而设计的东西。SQL是一种允许您操作和检索数据的语言,您还试图使用SQL来格式化检索到的数据的输出,我认为您不应该这样做:

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1431809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档