SELECT Query根据另一个表中的值选择值

时间:2014-04-04 14:53:48

标签: sql sql-server

我有2张桌子

  • Account(AccountId, Encoding)
  • DeviceAccountMap(AccountId, DeviceId)

现在我需要从DeviceAccountMap获取设备。我将AccountId列表传递给存储过程,在从DeviceId表中提取DeviceAccountMap时,我需要将每个帐户的Encoding值与特定值进行比较。

这是一种简单的方法吗?我完全迷失了。

存储过程中的select子句如下所示:

DECLARE @Accounts [usp].[Array]

[usp].[Array]定义如下

CREATE TYPE [usp].[Array] AS TABLE
(
    Value VARCHAR(36)   NULL
)

SELECT 
   DeviceId,
   AccountEncoding = A.Encoding
FROM 
   usp.DeviceControllerAccountMap DCAM
INNER JOIN 
   usp.Account A ON (DCAM.AccountId = A.AccountId)
WHERE 
   DCAM.AccountId IN (SELECT Value From @AccountIds) 
   AND DCAM.IsShared = 1 
   AND AccountEncoding LIKE A.Encoding + '.%'

换句话说,我需要获取每个帐户的编码值,并在此where子句中使用它。

2 个答案:

答案 0 :(得分:1)

以下行完全没必要。 JOIN to Account会为您过滤此过滤器。

   DCAM.AccountId IN (SELECT Value From @AccountIds) 

或者我错过了什么?

答案 1 :(得分:1)

因此,您可以在T-SQL中查找有关表值参数(TVP)的信息。

<强> Here is an article by Erland Sommarskog.

您可以参考 this StackOverflow answer 查看调用使用TVP的存储过程的C#代码示例。我相信TVP需要SQL Server 2008或更高版本。

据我所知,TVP提供了一种在sql server中创建自己的数据类型的方法,它被视为表格。当您声明Array类型,然后在存储过程的select语句中使用@AccountIds时,您就会这样做。

CREATE TYPE [usp].[Array] AS TABLE    -- maybe choose a more descriptive name than 'Array'
(
    Value VARCHAR(36) NULL            -- choose a more descriptive name than 'Value'
)

CREATE PROCEDURE [usp].[your_procedure_name]
    @AccountIds [usp].[Array] READONLY       -- use TVP as a parameter
AS
SELECT  …

您的问题详细信息尚不清楚您是否还要在Encoding的存储过程中使用参数。您似乎正在寻找编码以一段时间开始的帐户。&#39;。

首先,创建您的类型,就像您正在做的那样。 然后创建您的存储过程。 然后测试你的存储过程,如下所示:

DECLARE @mylist Array                           -- make TVP sample data 
INSERT @mylist(Value) VALUES(1),(11),(27),(123) -- insert some values
exec your_procedure_name @mylist                -- run stored procedure