Запрос, показывающий записи, которые НЕ совпадают между таблицами - PullRequest
5 голосов
/ 30 ноября 2010

У меня есть две таблицы.Одним из них является таблица отчетов, которые были представлены нам.Еще одна временная таблица с записями отчетов, которые в конечном итоге должны быть представлены нам.Я хотел бы показать только записи во временной таблице, которые не совпадают с записями в таблице отчетов (поэтому отображаются отчеты, которые все еще должны быть отправлены).

Пример данных:

Reports table:

CREATE TABLE [dbo].[Reports]  
(  
    [ReportID] [int] IDENTITY(1,1) NOT NULL,  
    [ReportDate] [date] NULL,  
    [AssessmentID] [int] NOT NULL,  
    [ReportType] [varchar](50) NULL  
);  

AssessmentID    ReportType  ReportID  
1   1st Quarterly   27  
2   1st Quarterly   30  
2   2nd Quarterly   31  
2   3rd Quarterly   32  

QuarterlyReportsDue table:

CREATE TABLE #QuarterlyReportsDue  
(  
AssessmentID INT,  
InstallationDate DATE,  
QuarterlyReportType VARCHAR(50)  
);  

AssessmentID    InstallationDate    QuarterlyReportType  
1   2009-08-14  1st Quarterly  
1   2009-08-14  2nd Quarterly  
1   2009-08-14  3rd Quarterly  
1   2009-08-14  4th Quarterly  
2   2008-05-16  4th Quarterly  
2   2008-05-16  3rd Quarterly  
2   2008-05-16  2nd Quarterly  
2   2008-05-16  1st Quarterly  

Я пробовал ВНЕШНЕЕ СОЕДИНЕНИЕ, но столкнулся с проблемамиПожалуйста, посмотрите мой ниже SQL:

SELECT #QuarterlyReportsDue.InstallationDate, #QuarterlyReportsDue.QuarterlyReportType, Reports.ReportType  
FROM #QuarterlyReportsDue  
LEFT OUTER JOIN Reports ON #QuarterlyReportsDue.AssessmentID = Reports.AssessmentID  
WHERE Reports.ReportType IN ('1st Quarterly', '2nd Quarterly', '3rd Quarterly', '4th Quarterly')  
AND Reports.ReportType <> #QuarterlyReportsDue.QuarterlyReportType  
ORDER BY #QuarterlyReportsDue.AssessmentID  

И мои результаты:

AssessmentID    QuarterlyReportType ReportType  ReportID  
1   2nd Quarterly   1st Quarterly   27  
1   3rd Quarterly   1st Quarterly   27  
1   4th Quarterly   1st Quarterly   27  
2   4th Quarterly   1st Quarterly   30  
2   4th Quarterly   2nd Quarterly   31  
2   4th Quarterly   3rd Quarterly   32  
2   1st Quarterly   2nd Quarterly   31  
2   1st Quarterly   3rd Quarterly   32  
2   3rd Quarterly   1st Quarterly   30  
2   3rd Quarterly   2nd Quarterly   31  
2   2nd Quarterly   1st Quarterly   30  
2   2nd Quarterly   3rd Quarterly   32  

Для оценки 1 это прекрасно работает, оценка 2 имеет много дубликатов.Как я могу обойти это, чтобы показать только идеальные результаты?

AssessmentID    QuarterlyReportType ReportType  
1   2nd Quarterly   1st Quarterly  
1   3rd Quarterly   1st Quarterly  
1   4th Quarterly   1st Quarterly  
2       4th Quarterly     

Ответы [ 5 ]

5 голосов
/ 30 ноября 2010

Когда вы ЛЕВЫЕ СОЕДИНЯЕТЕСЬ к таблице и затем ссылаетесь на один из столбцов этой таблицы в предложении WHERE, вы неявно превращаете объединение в INNER JOIN.Вместо этого удалите эти условия из WHERE и сделайте их частью условий JOIN.

SELECT q.InstallationDate, q.QuarterlyReportType, Reports.ReportType  
    FROM #QuarterlyReportsDue q
        LEFT OUTER JOIN Reports r
            ON q.AssessmentID = r.AssessmentID
                AND q.QuarterlyReportType = r.ReportType  
                AND r.ReportType IN ('1st Quarterly', '2nd Quarterly', '3rd Quarterly', '4th Quarterly')  
    WHERE r.AssessmentID IS NULL /* matching record not found in Reports table */
    ORDER BY #QuarterlyReportsDue.AssessmentID  
3 голосов
/ 30 ноября 2010

Вы должны использовать NOT EXISTS, чтобы найти записи во временной таблице, у которых нет соответствующих записей в таблице отправленных отчетов.

2 голосов
/ 30 ноября 2010

Что-то вроде этого возможно?

SELECT     qrd.InstallationDate, 
           qrd.QuarterlyReportType
FROM       #QuarterlyReportsDue qrd 
WHERE      qrd.QuarterlyReportType IN ('1st Quarterly', '2nd Quarterly', '3rd Quarterly', '4th Quarterly')
           AND NOT EXISTS (
                 SELECT   1 
                 FROM     Reports r 
                 WHERE    r.AssessmentID = qrd.AssessmentID 
                          AND r.ReportType = qrd.QuarterlyReportType
              )
ORDER BY   qrd.AssessmentID   
2 голосов
/ 30 ноября 2010

Это объединение умножит записи из двух таблиц друг в друга ( декартово ), и поэтому вы получаете больше записей, возвращающихся.

Помните, что вы присоединяетесь к AssessmentId и есть несколько записей с одинаковым assessmentId.Хотя вы отфильтровываете тех, у кого нет того же ReportType, но вы сталкиваетесь с новыми комбинациями .

SELECT #QuarterlyReportsDue.InstallationDate, 
       #QuarterlyReportsDue.QuarterlyReportType
FROM #QuarterlyReportsDue 
WHERE NOT EXISTS
      (
      SELECT 1 
      FROM Reports 
      WHERE Reports.ReportType = QuarterlyReportsDue.QuarterlyReportType 
      AND #QuarterlyReportsDue.AssessmentID = Reports.AssessmentID 
      )
0 голосов
/ 30 ноября 2010
select *
from Reports r
left join #QuarterlyReportsDue d 
    on d.AssessmentID=r.AssessmentID
    and d.QuarterlyReportType=ReportType
where d.AssessmentID is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...