2009-09-16 11 views
2

SQL에 약간 익숙하며 다음과 같은 문제가 발생했습니다.SQL 하위 쿼리 선택

연락처 테이블에 enqID로 결합 된 회사 정보가있는 테이블이 있습니다.

연락처 테이블에는 연락처가 있거나 없을 수있는 4 가지 유형의 연락처가 있습니다. 이들은 ctcTypID (1 - 4)로 구분됩니다.

회사 레코드가 모두있는 쿼리와 4 가지 다른 유형의 연락처 각각에 대한 연락처 이름을 모두 한 행에 포함하고 싶습니다.

다른 연락처 각각에 대해 하위 쿼리를 사용하여이 작업을 수행 할 수 있다고 생각했지만 부모 SELECT 절을 참조하는 하위 쿼리 SELECT 절을 작성하는 방법을 알지 못해서 작동하지 않는 것처럼 보입니다. 내가 무슨 뜻인지 안다면!)

이것도 가능합니까? 언급했듯이, 나는 SQL에 익숙하지 않으므로 너무 조롱하지 않도록 노력하십시오!

감사합니다,

스티브

+0

죄송합니다. SQL Server 2005. –

답변

2

(당신이 SQL 서버 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을 사용할 필요가 이 작업을 수행하면 쿼리가 성능 측면에서 매우 빠른 것은 아니지만 잘하면 작동 할 것입니다.

마크

+0

고마워, 나는 이것이 내가 필요한 것을 할 것이라고 생각한다. 구문에 대해서는 잘 모르겠습니다. –

-1

당신이 그것을 위해 설계되지 뭔가 SQL을 사용하려는 생각합니다. SQL은 데이터를 조작하고 검색 할 수있는 언어이기 때문에 SQL을 사용하여 검색된 데이터의 출력 형식을 지정하려고합니다. 그러면 다음을 수행해서는 안됩니다 :

형식 (모든 행을 한 행에 배치) fi SQL을 사용하여 데이터. 조언 : 가장 성능이 좋은 SQL 쿼리를 사용하여 데이터베이스에서 데이터를 검색하고 다른 언어 (C#, Delphi, PHP 등)로 출력 형식을 지정합니다 (동일한 행에 연락처 배치). 너의 어플리케이션).

+0

나는 당신이 조금 가혹하다고 생각합니다. Marc_S가 보여 주듯이 이것을 단일 SQL 문으로 작성하는 것은 매우 간단합니다. 실제로 별도의 SQL 출력물을 가져 와서 원하는 레이아웃에 맞추는 것이 더 까다 롭습니다. – APC

+0

이 경우 실제로는 다소 간단한 SQL 문으로 가능합니다. 그러나 다른 유사한 경우에는 종종 사람들이 매우 복잡하고 비효율적 인 쿼리 (UDF의 경우도 있음)를 작성하는 것을 보았습니다. 따라서 나에게 일반적인 규칙은 sql을 사용하여 출력 형식을 지정하지 않는 것입니다. 이 경우 데이터는 하나의 join 문과 order by 절을 사용하여 하나의 간단한 SQL로 검색 할 수 있으며 그 결과는 간단하게 형식화 할 수 있습니다. –

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