2014-07-22 58 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 

热膨胀系数是这样的事情非常方便。