SQL如何使多个值使用相同的Declare Variable?

时间:2015-01-15 15:05:37

标签: sql sql-server declare

我正在尝试执行以下操作

  1. 通过同一数据库中的联接链接两个表
  2. 取一个存在于两个FK_APPLICATIONID中的列(略有不同,     其中一个=另一个的+1。第1列= 1375,第2列= 1376
  3. 在其中一个表中存在参考编号(QREF1234)和另一个        包含11个phonenumbers
  4. 我希望能够输入参考编号,并返回全部11        phonenumbers是一个可声明的值。
  5. 使用Select * from TableD where phonenum in (@Declared variable)
  6. 这是我到目前为止所拥有的,

    Use Database 1
    
    DECLARE @Result INT;
    
    SELECT @Result = D.PhoneNum1,phonenum2,phonenum3,etc 
    
    FROM Table1 
    
    JOIN  TABLE2 D on D.FK_ApplicationID= D.FK_ApplicationID
    
    where TABLE1.FK_ApplicationID = D.FK_ApplicationID + 1 
    and QREF = 'Q045569/2'
    Use Database2
    
    Select * from Table3 where PhoneNum = '@result'
    

    TABLE1之类的名称不是它们的真实名称

    由于

4 个答案:

答案 0 :(得分:1)

我认为你是在追求这样的事情。 您正在尝试“规范化”未规范化的列,并在另一个表中搜索所有这些值。 您需要将结果合并到一个临时表中,然后搜索值。

Use Database 1


Create Table #tmp(PhoneNums varchar(50))

INSERT INTO #tmp
SELECT D.PhoneNum1
FROM Table1 
JOIN  TABLE2 D on D.FK_ApplicationID= D.FK_ApplicationID
where TABLE1.FK_ApplicationID = D.FK_ApplicationID + 1 
and QREF = 'Q045569/2'
union
SELECT D.PhoneNum2
FROM Table1 
JOIN  TABLE2 D on D.FK_ApplicationID= D.FK_ApplicationID
where TABLE1.FK_ApplicationID = D.FK_ApplicationID + 1 
and QREF = 'Q045569/2'
union
SELECT D.PhoneNum3
FROM Table1 
JOIN  TABLE2 D on D.FK_ApplicationID= D.FK_ApplicationID
where TABLE1.FK_ApplicationID = D.FK_ApplicationID + 1 
and QREF = 'Q045569/2'

--Use Database2
--you don't need to switch databases if you use a fully qualified name like shown below.
Select * from Database2..Table3 where PhoneNum in 
(
   Select PhoneNums from #tmp
)

答案 1 :(得分:0)

不,您不能使用变量来保存多个值并使用IN关键字。您可以传递分隔的值列表,解析该值,然后将IN与您解析的值集合一起使用。

在您发布的代码示例中,您可以改为创建一个表变量,并从中进行选择。

答案 2 :(得分:0)

变量只能包含一个值。而不是使用in运算符,您可以使用连接来完成同样的事情......

Use Database1

SELECT distinct
    T3.*
FROM 
    Table1 
    JOIN  TABLE2 D on D.FK_ApplicationID= D.FK_ApplicationID
    JOIN Database2.dbo.Table3 T3 on
        T3.PhoneNum = D.PhoneNum1
        or T3.PhoneNum = D.PhoneNum2
        or T3.PhoneNum = D.PhoneNum3
where 
    TABLE1.FK_ApplicationID = D.FK_ApplicationID + 1 
    and QREF = 'Q045569/2'

答案 3 :(得分:0)

如果您不想在联接中键入一堆OR,则可以使用IN进行联接。

select *
from Table3 t
left join Table2 D on t.PhoneNum in 
    (
        d.phonenum1
        , d.phonenum2
        , d.phonenum3
        , d.phonenum4
        , d.phonenum5
        , d.phonenum6
        , d.phonenum7
        , d.phonenum8
        , d.phonenum9
        , d.phonenum10
        , d.phonenum11
    )
    AND D.QREF = 'Q045569/2'

我建议您将数据标准化,然后这不是一个好的方法。