【问题标题】:TSQL Subquery relatedTSQL 子查询相关
【发布时间】:2025-12-20 23:40:11
【问题描述】:
SELECT DT.TenantDescription
    ,DT.PropertyNumber
    ,DT.UnitNo
    ,DT.AdressLn1
    ,DT.AddressLn2
    ,DT.AddressSituation
    ,(
        CASE 
            WHEN DT.TransactionCode = 1
                THEN DT.New_TransactionValue
            ELSE 0
            END
        ) AS RentDue
    ,(
        CASE 
            WHEN DT.TransactionCode = 2
                THEN DT.New_TransactionValue
            ELSE 0
            END
        ) AS OTHERSUMSDUE
    ,(
        CASE 
            WHEN DT.TransactionCode = 3
                THEN DT.New_TransactionValue
            ELSE 0
            END
        ) AS ARREARSBFWD
    ,(
        CASE 
            WHEN DT.TransactionCode = 4
                THEN DT.New_TransactionValue
            ELSE 0
            END
        ) AS ARREARSCFWD
    ,(
        CASE 
            WHEN DT.TransactionCode = 5
                THEN DT.New_TransactionValue
            ELSE 0
            END
        ) AS IRRECOVERABLERENT
    ,(
        CASE 
            WHEN DT.TransactionCode > 5
                THEN DT.New_TransactionValue
            ELSE 0
            END
        ) AS Expenditure
FROM (
    SELECT * * (
            SELECT New_TenantNameOnly
            FROM New_Rentmaster Rm
            WHERE Rm.New_rentmasterId = PD.new_rentmasterid
            ) AS TenantDescription
        ,* * (
            SELECT [New_UnitNumber]
            FROM new_propertyunits NPU
            WHERE NPU.[New_propertyunitsId] = PD.[new_unitnumberid]
            ) AS UnitNo
        ,(
            SELECT New_AddressLine1
            FROM New_address
            WHERE New_addressId = (
                    SELECT New_addressid
                    FROM New_PropertyMaster PM
                    WHERE PM.new_propertymasterid = PD.[new_propertynumbernameid]
                    )
            ) AS AdressLn1
        ,(
            SELECT New_AddressLine2
            FROM New_address
            WHERE New_addressId = (
                    SELECT New_addressid
                    FROM New_PropertyMaster PM
                    WHERE PM.new_propertymasterid = PD.[new_propertynumbernameid]
                    )
            ) AS AddressLn2
        ,(
            SELECT TT.[New_TransactionTypeCode] AS TransactionCode
            FROM New_transactiontype TT
            WHERE [New_transactiontypeId] = PD.[new_transactioncodenameid]
            ) AS TransactionCode
        ,(
            SELECT New_PropertyNumber
            FROM New_PropertyMaster PM
            WHERE PM.new_propertymasterid = PD.[new_propertynumbernameid]
            ) AS PropertyNumber
        ,(
            SELECT New_UnitAddressIdName
            FROM New_propertyunits NPU
            WHERE NPU.[New_propertyunitsId] = PD.[new_unitnumberid]
            ) AS AddressSituation
        ,PD.New_TransactionValue
    FROM New_PropertyDetails PD
    ) AS DT

上面的代码运行良好

现在我想对上面的列进行更改(名称别名为TenantDescription) 我想用下面的代码替换上面的列

Select New_TenantNameOnly from New_Rentmaster Rm    
  New_TenantNumber IN 
     (Select MAX(New_TenantNumber) from new_rentmaster GROUP BY [New_Unit_No],[New_Propety_Number])

然后它给我一个错误

子查询返回多个值

这段代码应该返回多个值

那我该怎么办>??

【问题讨论】:

  • 欢迎来到 *!正确格式化您的代码。

标签: sql-server tsql subquery


【解决方案1】:

如果您想要返回多个结果,您应该考虑使用 joins 而不是子查询。 Inner Join 看起来像这样:

SELECT *
FROM HumanResources.Employee AS e
INNER JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID

这将根据ON 条件匹配每个表中的行来生成尽可能多的行(例如,如果Employee 中有两行,BusinessEntityID 为 1,@987654326 中有三行@ 与 BusinessEntityID 为 1,以上将在结果集中产生六行 BusinessEntityID 为 1)

【讨论】:

  • 同时我正在寻找一个根据业务需求使用子查询而不是连接的答案
  • @OneThinker - 由于 select 子句中的子查询 不能 返回多个值,因此您必须在“产生我想要的结果”和“有一个 业务要求我使用子查询” - 因为我无法理解其中第二个如何有意义,所以我会选择第一个。