SQL 如何让多个值使用同一个声明变量?
SQL How to make multiple values use the same Declare Variable?
我正在尝试执行以下操作
- Link 两个表通过同一数据库上的连接
- 取两者都存在的列FK_APPLICATIONID(略有不同,
其中一个=另一个的+1,即第 1 列 =1375,第 2 列 = 1376
- 其中一个表中有一个参考号 (QREF1234),另一个
包含 11 个电话号码
- 我希望能输入Reference number,结果returns全11
电话号码作为单个可声明值。
- 使用
Select * from TableD where phonenum in (@Declared variable)
这是我目前的情况,
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这样的东西的名字不是他们的真名
谢谢
不,您不能使用变量来保存多个值并使用 IN
关键字。您可以传递一个带分隔符的值列表,对其进行解析,然后将 IN
与您解析的值集合一起使用。
在您发布的代码示例中,您可以创建一个 table 变量,并从中创建 select。
我想你正在寻找这样的东西。
您正在尝试 "normalize" 非规范化列并在另一个 table 中搜索所有这些值。
您需要将结果合并到临时 table,然后搜索值。
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
)
一个变量只能保存一个值。除了使用 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'
如果您不想在联接中键入一堆 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'
我建议您将数据规范化,这样就不会出现这种情况。
我正在尝试执行以下操作
- Link 两个表通过同一数据库上的连接
- 取两者都存在的列FK_APPLICATIONID(略有不同, 其中一个=另一个的+1,即第 1 列 =1375,第 2 列 = 1376
- 其中一个表中有一个参考号 (QREF1234),另一个 包含 11 个电话号码
- 我希望能输入Reference number,结果returns全11 电话号码作为单个可声明值。
- 使用
Select * from TableD where phonenum in (@Declared variable)
这是我目前的情况,
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这样的东西的名字不是他们的真名
谢谢
不,您不能使用变量来保存多个值并使用 IN
关键字。您可以传递一个带分隔符的值列表,对其进行解析,然后将 IN
与您解析的值集合一起使用。
在您发布的代码示例中,您可以创建一个 table 变量,并从中创建 select。
我想你正在寻找这样的东西。 您正在尝试 "normalize" 非规范化列并在另一个 table 中搜索所有这些值。 您需要将结果合并到临时 table,然后搜索值。
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
)
一个变量只能保存一个值。除了使用 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'
如果您不想在联接中键入一堆 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'
我建议您将数据规范化,这样就不会出现这种情况。