【问题标题】:Select multiple values within a single Declare statement在单个 Declare 语句中选择多个值
【发布时间】:2016-02-24 17:18:30
【问题描述】:
DECLARE @account VARCHAR(12)  
SET @account = '49943725'  

DECLARE @items VARCHAR(5)  
SET @items = (SELECT item_no FROM transactions   
               WHERE account = @account   
               AND item_no IN ('81','101','108','112','113','118','187','189','190','192','193','194','195'))

SELECT 
    property, CONVERT(VARCHAR(10), account) AS account,
    CONVERT(VARCHAR(5), item_no) AS item_no,
    CONVERT(VARCHAR(9), amount) AS amount,  
    CONVERT(VARCHAR(9), amt_paid) AS amt_paid, 
    status,
    CONVERT(VARCHAR(8), tran_id) AS tran_id, 
    CONVERT(VARCHAR(11), post_date) AS post_date, 
    tran_code, 
    CONVERT(VARCHAR(25), notes) AS notes, 
    clk, invoice, charge_property, * 
FROM 
    transactions 
WHERE 
    account = @account AND item_no = @items

错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

【问题讨论】:

  • 关于如何使@items = 多个值的任何提示?

标签: sql variables declare


【解决方案1】:

关于如何使@items = 多个值的任何提示?

否 - VARCHAR(5) 变量只能保存一个值。但是,您可以将列表嵌入为子查询:

SELECT 
     property, 
     CONVERT(VARCHAR(10), account) AS account,
     CONVERT(VARCHAR(5), item_no) AS item_no,
     CONVERT(VARCHAR(9), amount) AS amount,  
     CONVERT(VARCHAR(9), amt_paid) AS amt_paid, status,
     CONVERT(VARCHAR(8), tran_id) AS tran_id, 
     CONVERT(VARCHAR(11), post_date) AS post_date, tran_code, 
     CONVERT(VARCHAR(25), notes) AS notes, clk, invoice, charge_property, *
FROM transactions 
WHERE account = @account 
AND item_no IN (SELECT item_no FROM transactions   
               WHERE account = @account   
               AND item_no IN        
                ('81','101','108','112','113','118','187','189','190','192','193','194','195'))

【讨论】:

    【解决方案2】:

    您可以使用table variable

    DECLARE @Account VARCHAR(12) = '49943725';
    DECLARE @Items TABLE (ItemNo VARCHAR(5));
    
    INSERT @Items (Item_no)
    SELECT  item_no 
    FROM    transactions   
    WHERE   account = @account   
    AND     item_no IN ('81','101','108','112','113','118','187','189','190','192','193','194','195');
    

    然后在您的实际查询中使用IN

    AND     item_no IN (SELECT ItemNo FROM @Items);
    

    除非您获取项目的查询比您所显示的更复杂,否则您最好遵循 D Stanley 的建议并将您的查询放在主查询中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多