JLeibbrand Ответов: 2

Как удалить дубликаты с 8 внутренними соединениями?


Я не уверен, что кто-то будет заинтересован в том, чтобы помочь самостоятельному стартеру без особых знаний. Я заказал книгу по SQL, но у меня ее еще нет.
Я получаю данные и пробовал выбрать различные несколько способов и команду union, но безуспешно удаляя дубликаты.
Patid, дата appt и adacode должны управлять удалением дубликатов. Когда я делаю Select distinct, я получаю только два поля. Я попробовал больше полей и получил ошибки. Я попробовал Союз и те же ошибки. Поскольку я начинаю и недостаточно осведомлен, мне нужна помощь! Мой код приведен ниже.

Что я уже пробовал:



Select rb.city,
	   ab.PATID,	
	   pb.firstname, 
       pb.lastname,
	   clb.idnum,
       pb.firstvisitdate, 
       pb.lastvisitdate, 
       ab.apptdate,
	   CodeB.adacode,
	   CodeB.description,
	   LogB.Amount,
       InsB.groupname, 
       InsB.insconame,
	   Instb.copayment,
	   Logb.chart_status

FROM   ddb_appt_base AS ab
		INNER JOIN ddb_pat_base AS pb 
               ON ab.patid = pb.patid 
		 INNER JOIN ddb_insured_base AS ib 
               ON pb.patid = ib.insuredid 
		 INNER JOIN ddb_insurance_base AS InsB 
               ON ib.insid = InsB.insid 
		 INNER JOIN DDB_PROC_LOG_BASE AS LogB
			   ON ab.PATID = LogB.PATID
		 Inner Join DDB_PROC_CODE AS CodeB
			   On codeb.proc_codeid = LogB.proc_codeid
		 Inner Join DDB_RSC_BASE AS rb
		       On rb.urscid = Logb.clinicappliedto
		 Inner Join DDB_INSTABLE_BASE As Instb	
			   On ib.insid = instb.insid
		 Inner Join ddb_claim_base AS clb
			   ON clb.patid = ab.patid

WHERE  ab.apptdate BETWEEN '2016-05-01 00:00:00.000' AND 
                           '2017-04-30 00:00:00.000' 
       AND InsB.insid IN ( '1002420', '1002707', '1003104', '1003096',
                           '1002814', '1002820', '1002439', '1002579', '1003132' 
                         )
						  AND rb.city IN ( 'Anderson')

Richard Deeming

Если вы хотите получить помощь в исправлении ошибки, вам необходимо предоставить полную информацию об этой ошибке.

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

Предпочтительно, создать Скрипка SQL[^] с некоторыми фиктивными данными для репликации проблемы.

NB: DISTINCT распространяться ВСЕ столбцы в ваших результатах. Если вам нужны отдельные записи, основанные на подмножестве столбцов, то вам нужно будет использовать GROUP BY, и выберите агрегатную функцию для других возвращаемых столбцов.

GROUP BY (Transact-SQL) - SQL Server | Microsoft Docs[^]

2 Ответов

Рейтинг:
2

MarcusCole6833

Вот пример, полученный с помощью поиска в проекте кода


Идентификация и удаление дубликатов записей из таблицы SQL Server[^]


Рейтинг:
19

PeterMehrkens

Итак, я могу сказать по именам таблиц, что вы запрашиваете базу данных Dentrix.

Почти каждая таблица имеет составные ключи, и вы пропускаете поля в своем предложении join. Паттерн-PatId, PatDb; InsId, InsDb; InsuredId, InsurdDb и т. д. Для одной записи о приеме вы можете получить дополнительные неверные пациенты, которые имеют одно и то же значение идентификатора, но другое значение базы данных. Тогда вы можете получить дополнительные, неправильные страховки. И т.д.

Похоже, что вы получаете дубликаты, но если вы детализируете их, они различны.

напр.
Внутреннее соединение ddb_pat_base как pb на ab.patid = pb.patid
должно быть
Внутреннее соединение ddb_pat_base как pb на ab.patid = pb.patid и ab.patdb = pb.patdb

Это также означает, что вы не можете использовать свое предложение IN.

это должно быть что-то вроде:
И ((InsB.insid = '1002420' и insB.insdb = ##) или
(InsB.insid = '1002707' и InsB.insdb = ##) или
...)


JLeibbrand

Большое вам спасибо за эту информацию, она очень помогает, я просто учусь сам и пытаюсь получить конкретный отчет. Я там где угодно, кроме словаря базы данных, который дает вам подсказки о том, где находятся поля. Я пытаюсь найти фактическую вербализацию из ADACode в бухгалтерской книге для платежей, гаранта, страхования и т. д. Можно найти только описание, в котором просто написано "оплата-не удалять".

PeterMehrkens

У меня нет и нет постоянного доступа к базе данных Dentrix для проверки.

Я бы предположил, что Proc_Log или Proc_code. Но она может поступать из разных источников в зависимости от сделки.

Обычно я присоединялся к куче таблиц, которые, по моему мнению, являются вероятными, экспортировал результаты и искал некоторые примеры, которые я вижу. Вы также можете сделать обоснованные предположения о том, как они могут назвать столбец: select t.name, c.name from sys.tables as t inner join sys.columns as c on t.object_id = c.object_id where c.name например, " %desc%"