从select中设置值为少数选择

时间:2012-01-25 12:28:48

标签: tsql

我有选择,iside选择有2列。此列必须从相同的选择中填充,但我不希望使用select两次。是否可以使用选择1次,然后从第一次设置第二列值? 例如:

insert into @temptable from 
select
a = (select aa from table1 where quantity > 5)
b = (select aa from table1 where quantity > 5)

我需要:

insert into @temptable from 
select
a = (select aa from table1 where quantity > 5)
b = {value from a}

更新。我写了一个不好的例子,我需要设置Balance的BalancePrediction1和BalancePrediction2值

INSERT @tmpBalances
        SELECT PA.ContractId AS 'ContractId',
            Con.Name AS 'ContractName',
            Bal.PortfolioAccountId AS 'PortfolioAccountId',
            PA.Name AS 'PortfolioAccountName',
            RA.GeneralId AS 'RegisterAccountGeneralId',
            Bal.BalanceTypeId AS 'BalanceTypeId',
            Bt.Name AS 'BalanceTypeName',
            Bt.Type AS 'BalanceTypeType',
            Bal.BalanceTimeType AS 'BalanceTimeType',
            Bal.InstrumentId AS 'InstrumentId',
            Ins.Name AS 'InstrumentName',
            Ins.GeneralId AS 'InstrumentGeneralId',
            (Bal.Balance - 
                (       
                    SELECT COALESCE(SUM(Mov.Amount), 0)
                      FROM trd.Movements AS Mov 
                    WHERE   
                        Bal.InstrumentId = Mov.InstrumentId AND
                        Bal.PortfolioAccountId = Mov.PortfolioAccountId AND
                        Bal.BalanceTypeId = Mov.BalanceTypeId AND
                        Bal.BalanceTimeType = Mov.BalanceTimeType AND
                        DateDiff(DAY, @Date, Mov.Date) > 0 AND
                        -- Currency může být null a NULL = NULL nejde
                        COALESCE(Bal.CurrencyId, -1) = COALESCE(Mov.CurrencyId, -1)
                )
            ) as Balance,
            Balance AS 'BalancePrediction1',
            Balance AS 'BalancePrediction2',
            Bal.CurrencyId AS 'CurrencyId',
            Ccy.Code AS 'CurrencyCode',
            PA.PositionServiceType 'PositionServiceType',
            Ccy.Name 'CurrencyName',
            S.Nominal AS 'Nominal',
            S.NominalCurrencyId AS 'NominalCurrencyId',
            trd.GetCurrencyCode(S.NominalCurrencyId) AS 'NominalCurrencyCode'
          FROM trd.Balances AS Bal
            JOIN trd.PortfolioAccounts AS PA ON PA.Id = Bal.PortfolioAccountId
            JOIN trd.Contracts AS Con ON Con.Id = PA.ContractId
            JOIN trd.RegisterAccounts AS RA ON RA.Id = PA.RegisterAccountId
            JOIN trd.BalanceTypes AS Bt ON Bt.Id = Bal.BalanceTypeId
            JOIN trd.Instruments AS Ins ON Ins.Id = Bal.InstrumentId
            LEFT OUTER JOIN trd.Currencies AS Ccy ON Ccy.Id = Bal.CurrencyId
            LEFT JOIN trd.SecuritiesView S ON s.Id = Ins.Id AND DateDiff(d, S.ValidFrom, @Date) >= 0 AND (S.ValidTo IS NULL OR DateDiff(d, S.ValidTo, @Date) < 0)
                AND S.InstrumentInstrumentTypePriceUnit = 1

3 个答案:

答案 0 :(得分:3)

您可以在插入后对表变量进行更新。

update @tmpBalances
set BalancePrediction1 = Balance,
    BalancePrediction2 = Balance

或者您可以使用cross apply来计算总和。

INSERT @tmpBalances
        SELECT PA.ContractId AS 'ContractId',
            Con.Name AS 'ContractName',
            Bal.PortfolioAccountId AS 'PortfolioAccountId',
            PA.Name AS 'PortfolioAccountName',
            RA.GeneralId AS 'RegisterAccountGeneralId',
            Bal.BalanceTypeId AS 'BalanceTypeId',
            Bt.Name AS 'BalanceTypeName',
            Bt.Type AS 'BalanceTypeType',
            Bal.BalanceTimeType AS 'BalanceTimeType',
            Bal.InstrumentId AS 'InstrumentId',
            Ins.Name AS 'InstrumentName',
            Ins.GeneralId AS 'InstrumentGeneralId',
            (Bal.Balance - Mov.SumAmount) AS Balance,
            (Bal.Balance - Mov.SumAmount) AS 'BalancePrediction1',
            (Bal.Balance - Mov.SumAmount) AS 'BalancePrediction2',
            Bal.CurrencyId AS 'CurrencyId',
            Ccy.Code AS 'CurrencyCode',
            PA.PositionServiceType 'PositionServiceType',
            Ccy.Name 'CurrencyName',
            S.Nominal AS 'Nominal',
            S.NominalCurrencyId AS 'NominalCurrencyId',
            trd.GetCurrencyCode(S.NominalCurrencyId) AS 'NominalCurrencyCode'
          FROM trd.Balances AS Bal
            JOIN trd.PortfolioAccounts AS PA ON PA.Id = Bal.PortfolioAccountId
            JOIN trd.Contracts AS Con ON Con.Id = PA.ContractId
            JOIN trd.RegisterAccounts AS RA ON RA.Id = PA.RegisterAccountId
            JOIN trd.BalanceTypes AS Bt ON Bt.Id = Bal.BalanceTypeId
            JOIN trd.Instruments AS Ins ON Ins.Id = Bal.InstrumentId
            LEFT OUTER JOIN trd.Currencies AS Ccy ON Ccy.Id = Bal.CurrencyId
            LEFT JOIN trd.SecuritiesView S ON s.Id = Ins.Id AND DateDiff(d, S.ValidFrom, @Date) >= 0 AND (S.ValidTo IS NULL OR DateDiff(d, S.ValidTo, @Date) < 0)
                AND S.InstrumentInstrumentTypePriceUnit = 1
            CROSS APPLY (SELECT COALESCE(SUM(Mov.Amount), 0)
                         FROM trd.Movements AS Mov 
                         WHERE   
                            Bal.InstrumentId = Mov.InstrumentId AND
                            Bal.PortfolioAccountId = Mov.PortfolioAccountId AND
                            Bal.BalanceTypeId = Mov.BalanceTypeId AND
                            Bal.BalanceTimeType = Mov.BalanceTimeType AND
                            DateDiff(DAY, @Date, Mov.Date) > 0 AND
                            -- Currency může být null a NULL = NULL nejde
                            COALESCE(Bal.CurrencyId, -1) = COALESCE(Mov.CurrencyId, -1)
                        ) Mov(SumAmount)

答案 1 :(得分:1)

SELECT aa AS a, aa AS b
FROM table1
WHERE quantity > 5

答案 2 :(得分:0)

单向;

;with T (value) as (
    select aa from table1 where quantity > 5
)
insert into @temptable 
    select value, value from T