可以为SQL内部联接3个表吗?

cygmwpex  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(213)

我正在尝试通过使用存在于所有3个表中的列来获取某些数据,我有3个表

  • [Txn].[TxnPaymentResponse]
  • [Txn].[Txn]
  • [Txn].[TxnLineItem]

现在,如果我运行查询,我只能获得正确的数据userID

但我想从第三个表(TxnLineItem)获取另一条信息(假设调用列X)。前两个表中不存在该列。在这种情况下,我如何执行内部联接并在查询中显示该信息?

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]
WHERE
    TPR.[PaymentResponseType] = 'FINAL'
    AND TPR.[AuthorizedAmount] > CONVERT(DECIMAL(9,3), 0)
    AND (@CompletedTransactionSince IS NULL OR
         T.[CreatedOn] > @CompletedTransactionSince)

我的查询结果:

用户ID

C1671FDA-70A8-4C07-BBDF-ACD06ADD145F

表3:

TxnID|StandardProductCategory

6FE0D0D0-9959-41AA-9BF0-00000003DED8|洗车
D1B0EA51-C476-488C-A140-0000C1C7D099|通用

假设我正在进行内部连接,如下所示

INNER JOIN    
    [Txn].[TxnLineItem] TXL WITH(NOLOCK) ON T.[TxnID] = [Txn].[TxnID],

但是我想要获取具有相同transactionID的X列。我要显示仅具有CarwashUserID。不确定是否可以编写具有内部联接的另一个子句。

rsaldnfx

rsaldnfx1#

根据“我想显示仅有Carwash的用户ID”,您需要排除记录。

只需在To Query的末尾添加这些EXISTS和NOT EXISTS子句。

存在的部分是有洗车功能的过滤器用户。

Not Existes部分排除具有除洗车外的StandardProduct类别记录的用户

......
AND (@CompletedTransactionSince IS NULL OR
     T.[CreatedOn] > @CompletedTransactionSince)
AND EXISTS ( SELECT 1 FROM [Txn].[TxnLineItem] TXL 
             WHERE T.[TxnID] = [Txn].[TxnID] 
               AND TXL.StandardProductCategory='Carwash')
AND NOT EXISTS( SELECT 1 FROM [Txn].[TxnLineItem] TXL 
                 WHERE T.[TxnID] = [Txn].[TxnID] 
                  AND TXL.StandardProductCategory=<>'Carwash')

相关问题