SQL - 比较多行并返回行?

时间:2017-05-02 19:48:36

标签: sql sql-server

我有一个大型数据库,我想从一个表(Term)中提取信息,其中Names没有链接到某个SearchId的PartyId。但是:

  1. 搜索有多个版本(有时20-40个 - 否则我认为SQL - Comparing two rows and two columns对我有用)
  2. 对于搜索的第一个版本,PartyId几乎总是为NULL,如果同一个SearchId的相同名称在更高版本中关联了PartyId,则NULL行不应出现在查询结果中。
  3. 我有8个左连接来显示所请求的信息 - 其中3个连接在Term表
  4. 下面是一个非常简化的数据样本

    CASE声明?加入桌子进行比较?临时表还是只返回我正在加入和/或想要显示的字段?

    sample Term grid

1 个答案:

答案 0 :(得分:0)

提供不产生预期结果的样本数据不如提供给出预期结果的数据有用..

当提出问题时,首先要用简单的英语定义问题。如果你不能,你还不能很好地理解你的问题。然后定义问题中涉及的表(包括列)和样本数据;您尝试过的SQL,以及您期望的结果是使用示例中的数据。如果没有这些最低限度的信息,我们会做出许多猜测,即使有了这些信息,我们也可能需要做出假设;但如果没有最低限度可验证的示例来说明您的问题,那么帮助就会产生问题。

- 结束肥皂盒

我猜你只关注一个searchID的名字,该名称对于最高的SearchVerID具有NULL partyID

因此,如果我们从您的示例数据中删除了ID 6,那么将返回“Bob” 如果我们将ID 9添加到名称为'Harry'的样本数据中,其搜索ID为2且searchVerID为3且null partyID,那么'Harry'也将被返回... 如果我的理解是正确的,那么也许......

WITH CTE AS (
  SELECT Name, Row_Number() over (partition by Name order by SearchVersID Desc)
  FROM Term
  WHERE SearchID = 2)
SELECT Name 
FROM CTE
WHERE RN = 1 
  and partyID is null;

这为从1开始的每个名称分配行号(RN),并为每个条目增加1;对于searchID是2.最高的searchversion将始终具有1的RN。然后我们过滤以仅包括那些为1且具有空partyID的RN。这将导致只有searchID为2的最高搜索版本和NULL partyID

好的所以我也以不同的方式提出了这个问题。

如果您只是希望所有名称都没有链接到给定搜索的PartyID。

SELECT A.* 
FROM TERM A
WHERE NOT EXISTS (SELECT 1 
                  FROM TERM B 
                  WHERE A.Name = B.Name 
                    AND SearchID = 2) and partyID is not null)
AND searchID = 2

以上内容应返回与searchID 2相关的所有条款记录 有一个partyId。最后一个方法是我在评论中讨论的存在不存在和设置逻辑。