Цикл SQL Server по записям - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть представление vwDocumentLinks с данными, как показано ниже:

View Results

У меня есть другая таблица RiskTypes с данными, как показано ниже.

Risk Types Table

Связь между таблицей и представлениями: Idx25 = Risk Type и LinkDocNo = DocumentType.То, чего я пытаюсь достичь, это получить DocumentType в RiskTypes, которого нет в представлении vwDocumentLinks foreach BaseValue и где Idx25 = 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')

query result

Я попытался выполнить приведенный ниже запрос, и он не работает должным образом.Любая помощь будет оценена.Я новичок в 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

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Я думаю, что вы ищете NOT EXISTS.Требуется немного времени, чтобы разобраться, но идея в том, чтобы иметь то, что называется коррелированным подзапросом.Подзапрос присоединяется к основному запросу, поэтому термин коррелирует.

SELECT *
FROM RiskTypeDocuments
WHERE NOT EXISTS (
    SELECT 1 FROM vwDocumentLinks
    WHERE RiskTypeDocuments.RiskType = vwDocumentLinks.idx25
          AND RiskTypeDocuments.DocumentType = vwDocumentLinks.LinkDocNo
)
0 голосов
/ 26 ноября 2018
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 )
0 голосов
/ 26 ноября 2018

Если вы хотите получить записи, которых нет в представлении, попробуйте вот так

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
...