2012-02-23 2 views
1

한 번에 실행해야하는 두 가지 SQL 쿼리가 있습니다. 그러나 둘 모두에서 내부 조인을 사용하고 있기 때문에 조인 할 수는 없습니다. 이것을 할 수있는 방법이 있습니까? 또한 많은 정규화가 문제를 일으킬 수 있다고 생각합니까?여러 쿼리를 하나의 쿼리로 실행하는 SQL Server

SELECT S.SchoolName,Sd.DepartmentName,E.GraduationDate 
FROM Education E 
      INNER JOIN SchoolDepartment Sd ON Sd.DepartmentID = E.DepartmentID 
      JOIN School S ON S.SchoolID = Sd.SchoolID 

SELECT c.CompanyName,dt.DepartmentName, pl.PositionLevelName 
FROM Employee Ee 
      INNER JOIN Position P ON Ee.PositionID = P.PositionID 
      JOIN Company c ON c.CompanyID = P.CompanyID 
      JOIN Department De ON De.DepartmentID=P.DepartmentID 
      JOIN DepartmentType dt ON dt.DepartmentName = De.DepartmentTypeID 
      JOIN PositionLevel pl ON pl.PositionLevelID=P.PositionLevelID  
+0

페이지에 여러 개의 검색어가 잘못 표시되지 않았습니다. 이 2 개의 쿼리는 아마도 1 초도 안 걸릴 것입니다. 하지만 정말로 시간을 절약하고 싶다면 JonH와 함께 가서 UNION을하십시오. – Induster

답변

1

두 프로필이 각각 어떻게 연결되어 있는지, 그리고 각 세트가 서로 관련이없는 많은 행을 가지는지 여부는 지정하지 않았습니다. 각각이 단지 하나의 행을 반환하고 둘 다 프로파일과 관련이 있다면 (관계형 데이터베이스의 의미와 관련된 - 속성은 키 (아마도 프로파일)과 관련이 있습니다), 거기에 아마도 하나의 결과로 결합하는 현실적인 방법이있을 것입니다 집합 (즉, 관계 또는 표).

세트가 그 의미와 관련이 없다면 사용할 수있는 몇 가지 전략이 있습니다.

  1. 순서대로 모두 결과 집합을 반환하고 독자에 설정 한 다음 결과를 얻기 위해 ADO.NET의 기능을 사용하는 것과 동일한 명령에 모두 하나의 저장 프로 시저 또는 일괄 처리를합니다.

  2. 데이터베이스를 순차적으로 두 번 호출하십시오.

  3. ASP 및 ADO의 비동기 기능을 사용하여 데이터베이스에 대한 동시 호출을 두 번 수행하고 완료를 처리합니다. 대용량 사이트에서는 제어가 완료되면 제어가 페이지를 반환하여 스레드를 확보하므로 유용합니다.

0

필드가 동일한 데이터 유형이 두 쿼리를 결합 UNION을 사용할 수 있습니다 (쿼리 1 경기 쿼리 2의 동일한 데이터 형식의 열)의 경우 그렇지 않으면이 아니 가능하면 그들에 가입 할 수 없습니다 경우 .

+0

페이지를로드 할 때 facebook이 모든 사용자 정보를 한꺼번에 가져 오는 방법은 무엇입니까? – Codette

+0

@ tfeseas - 작업을 비교하지 마십시오. 페이스 북의 작품. Facebook에는 수백 명의 직원이 있습니다. 어쨌든 나는 facebook을 위해 일하지 않기 때문에 나는 그들의 데이터베이스가 어떻게 생겼는지 모른다. 프로파일 정보를 여러 테이블에 저장할 수 있지만 pk fk 관계를 통해 연결됩니다. 그리고 그들은 여러 번 데이터베이스에 대한 다중 호출을하지 않는다고 말하는 사람들이있을 것입니다. – JonH

+0

수십 개의 쿼리가있는 일부 페이지에서 작업합니다 ... 이는 단지 삶의 사실입니다. – Induster

3

두 개의 서로 다른 데이터 집합을 얻으려는 것처럼 보입니다. 따라서 두 쿼리를 실행하는 것이 세계에서 가장 나쁜 것은 아닙니다.

귀하의 의견에 따르면 페이스 북은 프로필 페이지를로드 할 때 여러 매장을 쿼리하지만 데이터 캐싱을 과도하게 사용하고 있기 때문에 프로필 개체를 캐시하여 데이터베이스 적중률을 줄일 수 있습니다.

+0

하지만 그들은 캐시하기 전에 그들은 database.Caching에서 데이터를 얻지 않는 또 다른 일이지만 그것을 캐싱 내가 그걸 검색해야하고 내가 열고/검색/닫기 연결을 만드는 절차를 만들거나 더 나은 방법을 묻는 해요 그렇게? – Codette

+0

데이터를 검색하는 데 사용하는 기술에 따라 다르지만 단일 연결을 열고이를 사용하여 두 데이터 집합을 모두 검색 한 다음 닫습니다. 동일한 연결에서 여러 명령문을 실행할 수 있습니다. – swannee

+2

내가 말하고자하는 것은 예, 여러 쿼리를 수행하는 것이 단일 쿼리를 수행하는 것보다 비용이 많이 들지만 그렇다고해서 분명히 두 쿼리를 수행하지 않도록 끔찍하게 설계된 조합을 만들어야한다는 것을 의미하지는 않습니다. 감각. 동일한 연결을 공유하는 한 그 정도면 충분할 것입니다. – swannee

0

아니요, 한 번에 연결할 수 없습니다. 두 개의 연결을 열어서 처리 할 수있는 강력한 서버가 있어야합니다 (하나 이상의 코어가 있음을 의미합니다).

나는 당신의 질문에 답해 둡니다. 대부분의 사람들은 그렇지 않습니다.

나는 나는 그것이 SQ이나 lserver에서 어떻게 작동되지 즉 한 번에

실행하는 데 필요한 두 개의 서로 다른 SQL 쿼리를 가지고있다. 일괄 처리에 쓰면 동시에 실행되는 것이 아니라 하나씩 실행됩니다. 그들이 동시에 달리는 것이 당연하다고는 생각하지 않지만, 그것이 당신이 요구하는 것입니다.

그러나 충분히 강력한 applkication server (24 코어), 강력한 Oracle RAC (하이퍼 스레딩 = 96 병렬 스레드가있는 2 대의 컴퓨터에서 48 코어)를 제공하는 동시에 수백 개의 SQL을 수행하는 소프트웨어가 있습니다.

0

나는 비슷한 것을하려고합니다. 나는 실제로 하나의 데이터 세트로 다른 여러 기준에 의해 라인을 그룹화하려고합니다.내가하고있는 일은 모든 데이터를 임시 테이블로 쿼리 한 다음 임시 테이블을 다른 뷰로 쿼리하여 다시 결합하는 것입니다. 이 방법은 다른 견해를 보여줍니다. 예를 들어. 1 행에는 cat1 cat2 및 cat3이 포함됩니다. 2 호선은 고양이 2와 고양이 3입니다. 3 호선은 Cat1 ~ cat8입니다. 데이터는 모두 똑같은 조각입니다. 따라서 데이터베이스를 여러 번 방문하여 쿼리하면 오버 헤드가 발생하지 않습니다. temp를 여러 번 쿼리하여 조각을 하나의보기로 결합 할 수 있습니다. 또는 이러한보기가 필요하고 변경되면 일대일로 원하는 그룹으로 표를 만들 수 있습니다. 3 단계 접근 방식을 사용하면 합계를 한 번에 얻을 수 있습니다.

관련 문제