2015-03-19 57 views
1

我有一个表是这样的:SQL服务器:执行IF测试,看看行存在

[invoice_lines]

id (int), customerid (int), price (int), productname (text) 

我想查询此表,并提取所有行。但是我想要一个额外的列,它可以是1/0列,它检查是否存在一行,其中productname ='SLA'和customerid = customerid。

所以可以说我有一排它看起来像这样:

id customerid price  productname 
----------------------------------------- 
1  134   125  Internet 

我想提取该行,但我想看看是否有与产品名称=“SLA”和客户ID的所有行='134'。如果有一行符合这些标准,我想要额外的列(让我们称之为SLA)的值为1.如果它不存在,我希望该值为0.

任何指针?

+0

你究竟是什么意思?在表中,对于当前发票,对于当前客户? id是发票ID还是发票行项目ID? – 2015-03-19 11:57:13

+0

@ Dan-Guzman它的发票行项目ID。所以基本上我想检查具有发票行“Internet”的客户是否还有发票行“SLA”。如果他这样做,我希望选择在第五列中回显“是”或“1”。如果该客户与产品“SLA”没有关联,则显示“否”或“0”。 – simenh 2015-03-20 08:03:18

回答

3
select t1.*, 
     case when t2.customerid is not null 
      then 1 
      else 0 
     end as result_check 
from invoice_lines t1 
left join invoice_lines t2 on t1.customerid = t2.customerid 
          and t2.productname = 'SLA' 
+0

如果有多个匹配到“SLA”,这将乘以行数。 – 2015-03-19 12:01:21

0

您可以使用case您的新列将检查:

select id, customerid,price,productname 
    case when productname = 'SLA' and customerid = '134' then 1 else 0 end as SLA 
    from [invoice_lines] 
0

我会做这个用CROSS APPLY因为加入可能会产生重复行:

SELECT * 
FROM TableName t1 
CROSS APPLY (SELECT CASE WHEN EXISTS (SELECT * 
             FROM  TableName t2 
             WHERE t2.customerid = t1.customerid AND t2.productname = 'SLA') 
          THEN 1 
          ELSE 0 
         END AS SLA 
      ) a 
0

你应该只在select中使用exists。或者,使用窗口函数使用条件聚合。这可能是最有效的方法:

select il.*, 
     (case when sum(case when productname = 'SLA' then 1 else 0 end) over (partition by customerid) 
      then 1 
      else 0 
     end) as sla 
from invoice_lines il; 
0

对于表中的所有发票行,我建议围绕窗口函数的CASE表达式。具有customerid和productname密钥的复合群集/覆盖索引可提供最佳性能。

SELECT id 
     , customerid 
     , price 
     , productname 
     , CASE SUM(CASE WHEN productname = 'SLA' THEN 1 
         ELSE 0 
       END) OVER (PARTITION BY customerid) 
      WHEN 0 THEN 0 
      ELSE 1 
     END AS SLA 
FROM invoice_lines il; 

相关子查询还可以做的工作,但有可能会是一个临界点的执行计划更改为处理大量的发票行。

SELECT id 
     , customerid 
     , price 
     , productname 
     , CASE WHEN EXISTS (SELECT * 
          FROM  dbo.invoice_lines b 
          WHERE b.customerid = a.customerid 
            AND b.productname = 'SLA') THEN 1 
      ELSE 0 
     END AS SLA 
FROM dbo.invoice_lines AS a;