Sql server 在设置SQL变量的同一SELECT语句中使用SQL变量进行比较

Sql server 在设置SQL变量的同一SELECT语句中使用SQL变量进行比较,sql-server,tsql,Sql Server,Tsql,如何使以下T-SQL语句合法?我可以复制为每个CASE选项设置@Type变量的子查询,但我宁愿只执行一次子查询。可能吗 SELECT @Type = (SELECT CustomerType FROM dbo.Customers WHERE CustomerId = (SELECT CustomerId FROM dbo.CustomerCategories WHERE CatId= @CatId)), CASE WHEN @Type = 'Consum

如何使以下T-SQL语句合法?我可以复制为每个CASE选项设置@Type变量的子查询,但我宁愿只执行一次子查询。可能吗

SELECT
      @Type = (SELECT CustomerType FROM dbo.Customers WHERE CustomerId = (SELECT CustomerId FROM dbo.CustomerCategories WHERE CatId= @CatId)),
      CASE
         WHEN @Type = 'Consumer'THEN dbo.Products.FriendlyName
         WHEN @Type = 'Company' THEN dbo.Products.BusinessName
         WHEN @Type IS NULL THEN dbo.Products.FriendlyName
         WHEN @Type = '' THEN dbo.Products.FriendlyName
      END Product,
      ...
FROM
      Products
INNER JOIN
      Category
...
编辑:将我的示例修改为更具体的…现在必须运行…明天将返回…很抱歉签下简短内容,但必须接孩子:D明天将返回。谢谢


澄清:我不能将两者分开:在子查询的where clasue中,我需要引用主查询的join stmt中使用的表中的列。如果我把它们分开,那么@Type将失去相关性。

为什么不把它分成两个操作呢?你认为把它们拼凑成一句话会有什么好处

SELECT @Type = (subquery);

SELECT CASE WHEN @type = 'Consumer'...
冒着听起来迟钝的风险,你真的需要这个变量吗?为什么不:

SELECT CASE WHEN col_form_subquery = 'Consumer' THEN ...
  END Product
FROM (<subquery>) AS x;
一些注意事项:

我不知道你为什么认为子查询是解决这个问题的正确方法。通常,对于其他开发人员来说,构建适当的连接并让SQL Server整体优化查询要更好、更清晰,而不是试图变得聪明,在很大程度上独立于主查询来优化单个子查询。适当的联接将有助于消除前面的行,否则这些行可能会通过子查询被具体化,而只会被丢弃。信任SQL Server来完成它的工作,在本例中,它的工作是跨多个表执行联接。 如果SELECT不需要显示类别名称,则可能不需要加入dbo.Category。如果是这样,则更改where子句并将该连接删除为CusomterCategories。 如果您已经涵盖了所有可能的场景,则可以将第二种情况更改为简单的ELSE。 我对产品和类别之间的连接做了一个假设,为什么类别不像其他类别那样是复数?。如果不是这样,请告诉我们。
您不能这样做,您将得到以下错误

为变量赋值的SELECT语句不得与数据检索操作结合使用


将两者分开,然后将变量作为select语句的一部分返回

无法将它们分开。需要它们一起进行集合操作。你能解释一下你认为集合操作是什么意思吗?哈哈,我在自嘲……基本上我的意思是,在子查询的where clause中,我需要引用主查询的表join中使用的表中的列……我知道这可能还不清楚……请让我知道我可以澄清的任何细节。谢谢当然,提供一个子查询的示例,以及您需要引用哪些列,如何?不能将它们分开。集合操作需要将它们放在一起。不能将值赋给变量,同时返回一个结果以便了解。谢谢有没有一种方法可以避免多次执行子查询?一个变量只包含一行中的一个值,您希望如何使该集合完全基于该值?我在问题中编辑了我的说明。请让我知道,如果我可以澄清更多…谢谢!!你需要更具体一点,你还是太含糊了。请告诉我们你需要做什么,而不是告诉我们你认为你需要怎么做。我认为关于查询和变量如何工作,这里缺少了一个基本的链接,但如果您向我们展示示例数据和期望的结果,我们是非常聪明的人,可能会找到如何实现您所追求的目标。如果您指定使用的SQL Server版本,这也很有用!
SELECT @Col1 = Col1, @Col2 = Col2
  FROM (<subquery>) AS x;

-- then refer to those variables in your other query:

SELECT *, @Col1, @Col2 FROM dbo.Products WHERE Col1 = @Col2;
SELECT CASE 
      WHEN c.CustomerType = 'Company' THEN p.BusinessName
      WHEN COALESCE(c.CustomerType, '') IN ('Consumer', '') THEN p.FriendlyName
    END
    --, other columns
FROM dbo.Products AS p
INNER JOIN dbo.Category AS cat 
  ON p.CatId = cat.CatId
INNER JOIN dbo.CustomerCategories AS ccat
  ON ccat.CatId = cat.CatId
INNER JOIN dbo.Customers AS c
  ON c.CustomerId = ccat.CustomerId
WHERE cat.CategoryId = @CatId;