首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL:如何在不使用游标的情况下查找匹配的记录

T-SQL:如何在不使用游标的情况下查找匹配的记录
EN

Stack Overflow用户
提问于 2015-03-26 16:02:33
回答 2查看 161关注 0票数 0

我有两个表: ItemCriteria和Item

ItemCriteria具有以下字段

代码语言:javascript
复制
ID
Criteria1
Criteria2
Criteria3
Criteria4
Criteria5

项目具有除ID字段之外的相同字段

我需要在Item表中查找具有1个或多个匹配条件字段(不包括NULLS)的所有项目,并返回匹配的数量。

例如,如果我在ItemCriteria中有如下所示的记录:

代码语言:javascript
复制
+----+-----------+-----------+-----------+-----------+-----------+
| ID | Criteria1 | Criteria2 | Criteria3 | Criteria4 | Criteria5 |
+----+-----------+-----------+-----------+-----------+-----------+
|  1 | NULL      | AAB       | AAC       | NULL      | NULL      |
|  2 | AAB       | NULL      | NULL      | NULL      | NULL      |
|  3 | NULL      | AAC       | NULL      | NULL      | NULL      |
|  4 | AAA       | NULL      | AAC       | NULL      | NULL      |
|  5 | BBB       | AAB       | NULL      | NULL      | NULL      |
+----+-----------+-----------+-----------+-----------+-----------+

我在Item中有以下几行

代码语言:javascript
复制
+-----------+-----------+-----------+-----------+-----------+
| Criteria1 | Criteria2 | Criteria3 | Criteria4 | Criteria5 |
+-----------+-----------+-----------+-----------+-----------+
| AAA       | AAB       | AAC       | NULL      | NULL      |
| AAB       | AAC       | NULL      | NULL      | NULL      |
+-----------+-----------+-----------+-----------+-----------+

我希望结果是:

代码语言:javascript
复制
+-----------+-----------+-----------+-----------+-----------+------------------+----------------+
| Criteria1 | Criteria2 | Criteria3 | Criteria4 | Criteria5 | MatchingCriteria | ItemCriteriaID |
+-----------+-----------+-----------+-----------+-----------+------------------+----------------+
| AAA       | AAB       | AAC       | NULL      | NULL      |                2 |              1 |
| AAB       | AAC       | NULL      | NULL      | NULL      |                1 |              2 |
| AAB       | AAC       | NULL      | NULL      | NULL      |                1 |              3 |
| AAA       | AAB       | AAC       | NULL      | NULL      |                2 |              4 |
| AAA       | AAB       | AAC       | NULL      | NULL      |                1 |              5 |
+-----------+-----------+-----------+-----------+-----------+------------------+----------------+

目前,我有一个存储过程,它在ItemCriteria上打开一个游标并遍历条目,然后为每个条目创建一个执行的动态SQL语句。查询的结果被插入到临时表中。完成后,将处理临时表中的值,并将结果返回给调用者。

当涉及大量记录时,这是非常慢的。有没有更好/更快的方法来做这件事?

EN

回答 2

Stack Overflow用户

发布于 2015-03-26 16:24:06

如果我正确地理解了需求,那么它就相当简单。您可以在联接中使用多个ORed条件。

代码语言:javascript
复制
declare @ItemCriteria table (id int, criteria1 char(3), criteria2 char(3), criteria3 char(3), criteria4 char(3), criteria5 char(3))
declare @Item table (criteria1 char(3), criteria2 char(3), criteria3 char(3), criteria4 char(3), criteria5 char(3))

insert @ItemCriteria values 
    (1 , NULL, 'AAB', 'AAC', NULL, NULL),
    (2 ,'AAB', NULL, NULL, NULL, NULL),
    (3 , NULL, 'AAC', NULL, NULL, NULL),
    (4 ,'AAA', NULL, 'AAC', NULL, NULL),
    (5 ,'BBB', 'AAB', NULL, NULL, NULL)

insert @item values 
    ('AAA', 'AAB', 'AAC', NULL, NULL),
    ('AAB', 'AAC', NULL, NULL, NULL)

select
    coalesce(i.criteria1, ic.criteria1) as Criteria1,
    coalesce(i.criteria2, ic.criteria2) as Criteria2,
    coalesce(i.criteria3, ic.criteria3) as Criteria3,
    coalesce(i.criteria4, ic.criteria4) as Criteria4,
    coalesce(i.criteria5, ic.criteria5) as Criteria5,
    case when i.criteria1 = ic.criteria1 then 1 else 0 end +
        case when i.criteria2 = ic.criteria2 then 1 else 0 end +
        case when i.criteria3 = ic.criteria3 then 1 else 0 end +
        case when i.criteria4 = ic.criteria4 then 1 else 0 end +
        case when i.criteria5 = ic.criteria5 then 1  else 0 end as MatchingCriteria,
    ic.id as ItemCriteriaID
from
    @ItemCriteria ic
        left join @Item i on i.criteria1 = ic.criteria1 
                          or i.criteria2 = ic.criteria2 
                          or i.criteria3 = ic.criteria3 
                          or i.criteria4 = ic.criteria4 
                          or i.criteria5 = ic.criteria5
票数 0
EN

Stack Overflow用户

发布于 2015-03-26 22:39:56

在这里试试这个:

代码语言:javascript
复制
IF OBJECT_ID('tempdb..#ItemCriteria') IS NOT NULL
    DROP TABLE #ItemCriteria
IF OBJECT_ID('tempdb..#Item') IS NOT NULL
    DROP TABLE #Item

CREATE TABLE #ItemCriteria
(
    ID INT,
    Criteria1 VARCHAR(5),
    Criteria2 VARCHAR(5),
    Criteria3 VARCHAR(5),
    Criteria4 VARCHAR(5),
    Criteria5 VARCHAR(5),
)

INSERT INTO #ItemCriteria
VALUES  (1,NULL,'AAB','AAC',NULL,NULL),
        (2,'AAB',NULL,NULL,NULL,NULL),
        (3,NULL,'AAC',NULL,NULL,NULL),
        (4,'AAA',NULL,'AAC',NULL,NULL),
        (5,'BBB','AAB',NULL,NULL,NULL);

CREATE TABLE #Item
(
    Criteria1 VARCHAR(5),
    Criteria2 VARCHAR(5),
    Criteria3 VARCHAR(5),
    Criteria4 VARCHAR(5),
    Criteria5 VARCHAR(5),
);

INSERT INTO #Item
VALUES  ('AAA','AAB','AAC',NULL,NULL),
        ('AAB','AAC',NULL,NULL,NULL);

好了,现在我已经设置了表,下面是条件匹配。

代码语言:javascript
复制
 SELECT A.*,
        CASE WHEN A.Criteria1 = B.Criteria1 THEN 1 ELSE 0 END
        + CASE WHEN A.Criteria2 = B.Criteria2 THEN 1 ELSE 0 END
        + CASE WHEN A.Criteria3 = B.Criteria3 THEN 1 ELSE 0 END
        + CASE WHEN A.Criteria4 = B.Criteria4 THEN 1 ELSE 0 END
        + CASE WHEN A.Criteria5 = B.Criteria5 THEN 1 ELSE 0 END
        AS MatchingCriteria,
        B.ID AS ItemCriteriaID
FROM #Item A
INNER JOIN #ItemCriteria B
ON  A.Criteria1 = B.Criteria1
    OR A.Criteria2 = B.Criteria2
    OR A.Criteria3 = B.Criteria3
    OR A.Criteria4 = B.Criteria4
    OR A.Criteria5 = B.Criteria5
ORDER BY B.ID

结果:

代码语言:javascript
复制
Criteria1 Criteria2 Criteria3 Criteria4 Criteria5 MatchingCriteria ItemCriteriaID
--------- --------- --------- --------- --------- ---------------- --------------
AAA       AAB       AAC       NULL      NULL      2                1
AAB       AAC       NULL      NULL      NULL      1                2
AAB       AAC       NULL      NULL      NULL      1                3
AAA       AAB       AAC       NULL      NULL      2                4
AAA       AAB       AAC       NULL      NULL      1                5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29273530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档