【问题标题】:SQL Server Loop Over RecordsSQL Server 循环遍历记录
【发布时间】:2019-04-27 20:22:47
【问题描述】:

我有一个视图vwDocumentLinks,数据如下:

我有另一个表RiskTypes,数据如下。

表格和视图之间的链接是:Idx25 = Risk TypeLinkDocNo = DocumentType。我想要实现的是在RiskTypes 中获得DocumentType,这不在vwDocumentLinks foreach BaseValueIdx25 = RiskType 的视图中。使用单个 BaseValue 的示例将是:

SELECT * FROM RiskTypeDocuments WHERE RiskType = 'BUSINESS LIMITED COMPANY' AND DocumentType NOT IN (SELECT LINKDOCNO FROM DBO.VWLINKS WHERE BaseValue = '00007573-1637-4B8E-9374-730AF58BCFB6')

我尝试了以下查询,但它没有按预期工作。任何帮助将不胜感激。我是 SQL 新手

SELECT dbo.RiskTypeDocuments.DocumentType,
dbo.RiskTypeDocuments.RiskType,
dbo.vwLinks.BaseValue AS Document
FROM dbo.vwLinks LEFT OUTER JOIN
dbo.RiskTypeDocuments ON dbo.vwLinks.LinkDocNo = 
dbo.RiskTypeDocuments.DocumentType AND  dbo.vwLinks.Idx25 = 
dbo.RiskTypeDocuments.RiskType
WHERE dbo.RiskTypeDocuments.DocumentType IS NOT NULL
ORDER BY Document

注意:我无法更改架构。我只能从现有表中创建视图。 来自两个数据集的样本数据vwDocumentLinks & RiskTypeDocuments

【问题讨论】:

  • WHERE 子句条件使得 LEFT JOIN 返回常规的 INNER JOIN 结果。
  • 我刚刚尝试删除WHERE子句,结果几乎相同,只是其他列返回NULL
  • 您希望返回这些新值吗?如果是,请保持 LEFT JOIN。如果没有,请切换到 INNER JOIN。 (在任何情况下都不需要 WHERE 子句。)
  • 你是对的,切换到inner join后返回的结果还是一样的。但同样,这不是预期的结果
  • 将样本数据作为格式化文本而不是图像将是一个很好的 +。此外,像 1、2、3 这样的基本值而不是 172371237127124783123、717617837373737373763 和 837373739828936374893 会让事情变得更容易。

标签: sql sql-server join sql-server-2012 ssms


【解决方案1】:
SELECT a.DocumentType,
a.RiskType,
b.BaseValue AS Document 
FROM dbo.RiskTypeDocuments as a
INNER JOIN (Select distinct Idx25, BaseValue from vwDocumentLinks) as b on b.Idx25 = a.RiskType
where a.DocumentType not in (Select LINKDOCNO  from vwDocumentLinks as c where c.basevalue = b.BaseValue )

【讨论】:

  • 感谢@Ravi,此查询正在返回所需的结果
  • @TakudzwaMawarire 欢迎
【解决方案2】:

我认为您正在寻找的是NOT EXISTS。需要一点时间才能理解,但我们的想法是拥有所谓的相关子查询。子查询连接到主查询,因此术语相关。

SELECT *
FROM RiskTypeDocuments
WHERE NOT EXISTS (
    SELECT 1 FROM vwDocumentLinks
    WHERE RiskTypeDocuments.RiskType = vwDocumentLinks.idx25
          AND RiskTypeDocuments.DocumentType = vwDocumentLinks.LinkDocNo
)

【讨论】:

  • 谢谢@Alan。这将返回一个整体结果,而不是根据需要返回一个 foreach BaseValue
  • 抱歉,我不知道你所说的一个 foreach BaseValue 是什么意思——也许你可以提供一个更清晰的例子来解释你所追求的——这似乎并不容易理解。
  • SELECT * FROM RiskTypeDocuments WHERE RiskType = 'BUSINESS LIMITED COMPANY' AND DocumentType NOT IN (SELECT LINKDOCNO FROM DBO.VWLINKS WHERE BaseValue = '00007573-1637-4B8E-9374-730AF58BCFB6') 是我在我的问题中给出的例子。也许一个更简单的问题是如何在不指定两个指定值BaseValue && RiskType 的情况下使此查询工作,但仍按BaseValue && RiskType 对结果进行分组。抱歉,我习惯于将所有这些查询隐藏在 Entity Framework 后面,因此是我的术语。我希望不会增加更多的混乱。
  • 为这两个表提供一个完整但很小的源数据集和一组完整的预期结果。不包含不相关数据,不排除相关数据
  • 编辑问题以提供示例数据的链接
【解决方案3】:

如果你想检索视图中不存在的记录,那么 像这样试试

SELECT d.DocumentType,
       d.RiskType,
       v.BaseValue 
FROM dbo.vwLinks AS v 
OUTER JOIN dbo.RiskTypeDocuments d ON v.LinkDocNo = d.DocumentType AND v.vwLinks.Idx25 =d.RiskType
WHERE v.BaseValue IS NULL 
ORDER BY DocumentType

【讨论】:

  • 感谢您的回复,但这并没有为每个人返回所需的回复 BaseValue。在给出的示例中,我想要结果 for each Basevalue
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多