我有一个大型数据库,我想从一个表(Term)中提取信息,其中Names没有链接到某个SearchId的PartyId。但是:
下面是一个非常简化的数据样本
CASE声明?加入桌子进行比较?临时表还是只返回我正在加入和/或想要显示的字段?
答案 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。最后一个方法是我在评论中讨论的存在不存在和设置逻辑。