Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在t-sql中是否可以使用某种foreach语句?_Sql Server_Tsql_Foreach - Fatal编程技术网

Sql server 在t-sql中是否可以使用某种foreach语句?

Sql server 在t-sql中是否可以使用某种foreach语句?,sql-server,tsql,foreach,Sql Server,Tsql,Foreach,我有这样的数据,我正试图建立一个基于t-sql的表,它允许我查看每个唯一的CPR,如果该表有一行paymenttype 23和26,这是下面CPR 123的情况 它应该相当简单,但我对t-sql还不熟悉,还没有找到解决方案。几年前,在SAS公司,我隐约记得使用foreach语句处理类似的内容 任何帮助都将不胜感激 心肺复苏术 付款类型 123 23 123 26 111 28 144 26 144 27 下面介绍如何在或多或少可移植的SQL中实现这一点。这是一个工作小组由。。。有 选择CPR 来

我有这样的数据,我正试图建立一个基于t-sql的表,它允许我查看每个唯一的CPR,如果该表有一行paymenttype 23和26,这是下面CPR 123的情况

它应该相当简单,但我对t-sql还不熟悉,还没有找到解决方案。几年前,在SAS公司,我隐约记得使用foreach语句处理类似的内容

任何帮助都将不胜感激

心肺复苏术 付款类型 123 23 123 26 111 28 144 26 144 27
下面介绍如何在或多或少可移植的SQL中实现这一点。这是一个工作小组由。。。有

选择CPR 来自tbl 其中PaymentType输入23,26 心肺复苏组 计数*=2; 如果您正在寻找五种付款类型中有三种的任意组合,您可以这样做

选择CPR 来自tbl 其中PaymentType输入23、26、28、50、31 心肺复苏组 计数*=3; 这里的诀窍是记住SQL是一种声明性语言,而不是过程性语言。您描述了所需的结果集,SQL会为您找出如何获得这些结果。foreach是一种过程式操作。

关于T-SQL是否支持foreach

虽然没有ForEach,但也有类似的构造,如While循环和CURSOR等,可用于模拟ForEach循环。但是,我建议你不要使用它们,除非你别无选择

关于你问题的解决方案

有很多方法。下面是一种使用相关联查询的简单方法:

SELECT DISTINCT CPR
FROM YourTable T
WHERE EXISTS(SELECT * FROM YourTable WHERE CPR = T.CPR AND Paymenttype = 23)
  AND EXISTS(SELECT * FROM YourTable WHERE CPR = T.CPR AND Paymenttype = 26)

大家好,欢迎来到Stack Overflow。你能在这里更新标记并添加感兴趣的语言吗?首先,我认为Oracle和Microsoft都有被称为T-SQL的语言,所以你需要指定哪种语言。第二,虽然在这类语言中有编写循环的方法,但这通常不是解决问题的好方法;尝试从集合操作的角度来考虑,编写SQL查询几乎总是更好的。从你提供的有限信息来看,它似乎存在于。。。并且存在。。。我会在这里完成这项工作,不过如果你有大量数据,还有更有效的方法。谢谢@IMSoP,这是微软。如果set-wise操作更好,那是绝对好的。谢谢@kvantour,第一次查询的标记现在已更正,我更愿意说countdistinct PaymentType=2-我们对可能的重复项一无所知。尽管执行计划可能会变得不那么令人满意。或者,更简单地说:。。。其中T.PaymentType=23且存在,请从表中选择42作为YT26,其中YT26.CPR=T.CPR和YT26.PaymentType=26;。当您只需对其中一个值进行筛选时,无需对每个值都使用exists。旁白:最佳做法是在可能出现混淆的每个引用上使用表别名。@HABO,是的,你是对的。但对于像OP这样刚刚开始理解概念的人来说,这让事情变得更加复杂。