SQL多表内连接:如何关联3张表并筛选指定数据?
解决方法
你只需要在原查询基础上添加和TxnLineItem表的内连接,并针对StandardProductCategory字段添加筛选条件即可,以下是两种等价的实现方式:
方式一:在WHERE子句中筛选类别
DECLARE @CompletedTransactionSince DATETIME2(7) = '2022-09-13 00:00:00.000000' SELECT DISTINCT t.UserID FROM [Txn].[Txn] T WITH(NOLOCK) INNER JOIN [Txn].[TxnPaymentResponse] TPR WITH(NOLOCK) ON T.[TxnID] = TPR.[TxnID] -- 新增和TxnLineItem的内连接,关联TxnID INNER JOIN [Txn].[TxnLineItem] TLI WITH(NOLOCK) ON T.[TxnID] = TLI.[TxnID] WHERE TPR.[PaymentResponseType] = 'FINAL' AND TPR.[AuthorizedAmount] > CONVERT(DECIMAL(9,3), 0) AND (@CompletedTransactionSince IS NULL OR T.[CreatedOn] > @CompletedTransactionSince) -- 筛选出类别为Carwash的记录 AND TLI.StandardProductCategory = 'Carwash'
方式二:在JOIN连接条件中筛选类别
DECLARE @CompletedTransactionSince DATETIME2(7) = '2022-09-13 00:00:00.000000' SELECT DISTINCT t.UserID FROM [Txn].[Txn] T WITH(NOLOCK) INNER JOIN [Txn].[TxnPaymentResponse] TPR WITH(NOLOCK) ON T.[TxnID] = TPR.[TxnID] -- 关联TxnLineItem时直接筛选Carwash类别 INNER JOIN [Txn].[TxnLineItem] TLI WITH(NOLOCK) ON T.[TxnID] = TLI.[TxnID] AND TLI.StandardProductCategory = 'Carwash' WHERE TPR.[PaymentResponseType] = 'FINAL' AND TPR.[AuthorizedAmount] > CONVERT(DECIMAL(9,3), 0) AND (@CompletedTransactionSince IS NULL OR T.[CreatedOn] > @CompletedTransactionSince)
说明
- 两种写法的查询结果完全一致,区别仅在于逻辑可读性:方式二更直观地表达“只关联属于Carwash类别的交易行项目”,方式一则是先关联所有行项目再筛选。
- 保留原查询的
DISTINCT关键字,确保同一个UserID即使对应多个Carwash交易,也只会返回一次。
内容的提问来源于stack exchange,提问作者duckGame
相关产品推荐
相关产品推荐

