LEFT JOIN来自同一个TABLE

时间:2018-01-18 23:10:14

标签: sql-server left-join

我是SQL新手,我试图从分类帐表中查询 我有两个查询需要加入一个表

第一次查询:

SELECT * 
FROM TABLE 1
WHERE DATEDIFF(MONTH, [Transaction Date], GETDATE()) <= 3
    AND [ITEMTYPE] = 'F-C'
    AND ([Description] NOT LIKE '%REFILE%'
        AND [Description] NOT LIKE '%CROSSOVER%')
    AND ([UserNAME] LIKE '%USER1%'
        OR [UserNAME] LIKE '%user2%'
        OR [UserNAME] LIKE '%user3%')

第二次质疑:

SELECT [ENCID], SUM([Trans]) AS Total_Charges
FROM Table 1
WHERE DATEDIFF(MONTH, [Transaction Date], GETDATE()) <= 3 
    AND [ITEMTYPE] IN ('C')
GROUP BY [ENCID];

我需要将第二个查询连接到ENCID上的第一个查询

感谢。

2 个答案:

答案 0 :(得分:0)

好吧,你加入吧。没什么特别的,除了你必须记得给别名,例如Totals

我还将DATEDIFF(MONTH, [Transaction Date], GETDATE()) <= 3更改为[Transaction Date] >= DATEADD(MONTH, -3, GETDATE()),以允许SQL Server在[Transaction Date]列上使用索引(如果有的话)。

还引导通配符文本搜索,例如[UserNAME] LIKE '%user2%'很慢,如果可以的话,请避开它​​们:https://sqlperformance.com/2017/02/sql-indexes/seek-leading-wildcard-sql-server

SELECT *
FROM TABLE 1 AS a
    LEFT JOIN
        ( SELECT [ENCID], SUM([Trans]) AS Total_Charges
        FROM Table 1
        WHERE [Transaction Date] >= DATEADD(MONTH, -3, GETDATE())
            AND [ITEMTYPE] IN ('C')
        GROUP BY [ENCID] ) AS Totals ON Totals.[ENCID] = a.[ENCID]
WHERE 
    [Transaction Date] >= DATEADD(MONTH, -3, GETDATE())
    AND [ITEMTYPE] = 'F-C'
    AND ([Description] NOT LIKE '%REFILE%'
        AND [Description] NOT LIKE '%CROSSOVER%')
    AND ([UserNAME] LIKE '%USER1%'
        OR [UserNAME] LIKE '%user2%'
        OR [UserNAME] LIKE '%user3%')

答案 1 :(得分:0)

当您引入任何联接(对表或子查询)时,通过别名引用这些来源的列是至关重要的。

SELECT t1.* 
FROM TABLE_1 t1
LEFT JOIN (
            SELECT [ENCID], SUM([Trans]) AS Total_Charges
            FROM Table_1
            WHERE [Transaction Date] >= DATEADD(month,-3,GETDATE())
                AND [ITEMTYPE] IN ('C')
            GROUP BY [ENCID]
            ) sq ON t1.[ENCID] = sq.[ENCID]
WHERE t1.[Transaction Date] >= DATEADD(month,-3,GETDATE())
    AND t1.[ITEMTYPE] = 'F-C'
    AND (t1.[Description] NOT LIKE '%REFILE%'
        AND t1.[Description] NOT LIKE '%CROSSOVER%')
    AND (t1.[UserNAME] LIKE '%USER1%'
        OR t1.[UserNAME] LIKE '%user2%'
        OR t1.[UserNAME] LIKE '%user3%')

注意:我已经改变了考虑日期的方式,以便可以使用[交易日期]上的索引。而不是计算每一行的月数,计算日期然后将现有数据与该值进行比较要高效得多。为了获得最佳性能,请尝试避免在where子句中使用数据函数。