2015-04-01 88 views
-1

我有一个SQL Server的查询语句是这样的:合并2选择语句的最佳方法是什么?

WITH A 
AS (
    SELECT (
      SUM(CASE 
        WHEN (t1.price) > 0 
         THEN (t1.price) 
        ELSE 0 
        END) 
      ) AS pr1 
     ,(
      ABS(SUM(CASE 
         WHEN (t1.price) < 0 
          THEN (t1.price) 
         ELSE 0 
         END)) 
      ) AS pr2 
    FROM dbo.price_table AS t1 
    ) 
    ,B 
AS (
    SELECT (WHEN(pr1 - pr2) < 0 THEN ABS(pr1 - pr2) ELSE 0 END) AS res 
    FROM A 
    ) 
SELECT res 
FROM B 
我的查询

,我用2 select语句实现“资源”一栏,但我想实现在1个select语句“资源”一栏。

什么是合并的最佳途径2选择语句到1选择语句查询?

+1

为什么不使用联合? – 2015-04-01 14:42:26

+0

这个sql查询是我的总查询的一部分。这只是一个例子。 我想知道如何可以与其他方式的子查询合并... – 2015-04-01 14:52:21

+0

从技术上讲它是一个查询。它将以与子查询相同的方式进行编译。你希望从重组中得到什么好处? – 2015-04-01 14:53:51

回答

3

你的计算看起来很复杂。你正在取正值的总和。然后,使用ABS()将负值的总和作为正值,然后减去此结果。你猜怎么了?这与首先​​将所有值取为SUM()相同。

所以,我觉得这种说法是等价的:

SELECT (CASE WHEN SUM(t1.price) < 0 
      THEN ABS(SUM(t1.price)) 
      ELSE 0 
     END) 
FROM dbo.price_table t1; 
+0

我的sql查询只是一个例子。我想知道如何可以合并子查询或其他方式 – 2015-04-01 14:49:07

+0

@MehdiRadi。 。 。那么你应该问一个更现实的例子*另一个问题。这个问题已经有了答案,所以改变这个问题是不礼貌的,因为它会使答案失效。 – 2015-04-01 15:07:48

0

Common Table Expressions(CTE的)是编写可重用子查询的方式。有没有一种方法,与所有的热膨胀系数(CTE的作品可以自引用这是不可能的subqueries_。在您的例子中,查询

WITH A AS 
(
    {A query} 
) 
,B AS 
(
    SELECT ... res FROM A 
) 
SELECT res FROM B 

可以重新安排,以

SELECT res FROM 
(
    SELECT {expression} res FROM 
    (
     {A query} 
    ) 
) 

这仅仅是

SELECT {expression} res FROM 
(
    {A query} 
) 
0

您的解决方案是好的。 即使你使用multipple“选择”报表,他们将在一个查询编译。 所以您的查询等同于Gordon Linoff提出的查询。

如果您有更复杂的逻辑,您可以创建SINGLE查询:将最后一个“Select ...”和子查询(或表达式)替换为“pr1”和“pr2”。您可能会收到带有可重复部分的非常复杂的陈述。

当您使用“WITH”时,您可以将逻辑部分拆分为具有良好的可读性,而性能不会降低。我总是在复杂的查询中提供“WITH”。

+0

谢谢,但如何能为我的查询创建一个单一的查询? – 2015-04-01 18:22:36

相关问题