2014-07-22 59 views
0

我有以下2 JOIN聲明:使用JOIN語句加入對另一組的結果的結果JOIN語句

--Get Total Hrs 
DECLARE @BeginDate datetime, @EndDate datetime 
set @BeginDate = '01-01-2013' 
set @EndDate = '12-31-2013' 
BEGIN 
SELECT F.Type, E.Product, SUM(F.Hours * E.Amount) AS 'Total Hours' 
FROM Hours H 
INNER JOIN Equipment E 
ON F.SN = E.SN 
WHERE (F.Date BETWEEN @BeginDate AND @EndDate) 
GROUP BY F.Type, E.Product 
ORDER BY Product ASC 
END 

--Get Number of Unscheduled Removals 
DECLARE @BeginDate1 datetime, @EndDate1 datetime 
set @BeginDate1 = '01-01-2013' 
set @EndDate1 = '12-31-2013' 
BEGIN 
SELECT LEFT(dbo.fn_GetPartName(R.PartID),CHARINDEX('-',dbo.fn_GetPartName(R.PartID), 1) - 1) AS 'Part No', 
Count(s.status) AS NumberUnscheduledRemovals 
FROM Repair R 
INNER JOIN Conversion C 
ON R.Performed = C.Performed 
AND R.Confirmed = C.Confirmed 
INNER JOIN Status S 
ON C.StatusID = S.StatusID 
WHERE (R.Received BETWEEN @BeginDate1 AND @EndDate1) 
AND (S.Status = 'UNSCHEDULED') 
GROUP BY LEFT(dbo.fn_GetPartName(R.PartID),CHARINDEX('-',dbo.fn_GetPartName(R.PartID), 1) - 1) 
ORDER BY LEFT(dbo.fn_GetPartName(R.PartID),CHARINDEX('-',dbo.fn_GetPartName(R.PartID), 1) - 1) ASC 
END 

兩個查詢有結果,包括part numbers(這些具有相同的值)。我想INNER JOIN這兩個查詢的結果來自於產生的part numbers。已經嘗試了一段時間,但似乎沒有得到正確的語法來做到這一點。

回答

2

使用臨時表使用CREATE TABLE#TempPartNum1 &#TempPartNum2。

從前兩個查詢中獲取所有相關數據,並將它們放入臨時表中,然後加入臨時表。

+0

優秀!!!這是一個快速而簡單的解決方案。而不是使用CREATE ...我只是在第一個查詢中使用了INSERT INTO #myTempTbl,然後在第二個查詢結束時刪除了#myTempTable,併爲未來創建了一個storedProcedure。感謝解決方案 –

+0

我花了幾年時間爲Sybase編寫存儲過程(SQL的遠房親戚)。 #Temp表是解決和分解複雜程序任務的最常用方法。其他RDBMS風格(甲骨文,MySQL等)將會有不同的方法。它表明在選擇解決方案或方法之前,您確實需要了解您的工作環境(即SQL Server,Transact SQL)! –

1

你也可以使用一個CTE(「公用表表達式」):

;WITH QueryOne AS (
... put your first query here 
), QueryTwo AS (
... put your second query here 
) SELECT blah blah blah 
    FROM QueryOne INNER JOIN QueryTwo ON foo = bar 

熱膨脹係數是這樣的事情非常方便。