【问题标题】:Using results of JOIN statement to join on the results of another JOIN statement使用 JOIN 语句的结果连接另一个 JOIN 语句的结果
【发布时间】:2023-03-21 08:59:01
【问题描述】:

我有以下 2 个加入语句:

--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 的两个查询的结果。已经尝试了一段时间,但似乎无法获得正确的语法。

【问题讨论】:

    标签: sql sql-server join


    【解决方案1】:

    使用 CREATE TABLE #TempPartNum1 & #TempPartNum2 使用临时表。

    从前两个查询中获取所有相关数据并将它们放入临时表中,然后加入临时表。

    【讨论】:

    • 优秀!!!这是一个快速简单的解决方案。而不是使用 CREATE... 我只是在第一个查询中使用 INSERT INTO #myTempTbl ,然后在第二个查询结束时删除了 #myTempTable 并为将来创建了一个 storedProcedure 。感谢您的解决方案
    • 我花了几年时间为 Sybase(SQL 的远亲)编写存储过程。 #Temp 表是解决和分解复杂程序任务的最常用方法。其他 RDBMS 风格(Oracle、MySQL 等)应该采用不同的方法。这表明您在选择解决方案或方法之前确实需要了解您的工作环境(即 SQL Server、Transact SQL)!
    【解决方案2】:

    您也可以使用 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
    

    CTE 对于此类事情非常方便。

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      相关资源
      最近更新 更多