Как я могу выбрать не дублирующиеся строки с внутренним соединением? - PullRequest
1 голос
/ 30 ноября 2009

Мой MS SQL Server хранимая процедура :

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_close]
@DATE NVARCHAR(8)
AS
BEGIN
SELECT appointment_datas.appointment_date
        ,appointment_datas.appointment_no
        ,costumer_datas.costumer_name
        ,appointment_datas.appointment_type
        ,personel_datas.personel_ADI
FROM [LONI].[dbo].appointment_datas
        INNER JOIN [LONI].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id
        INNER JOIN [LONI].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id
        INNER JOIN [GUONU].[dbo].dayend ON appointment_datas.appointment_no <> dayend.appointment_no COLLATE Turkish_CI_AS
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112) = @DATE
END

С помощью этого кода я выбираю повторяющиеся строки из одних и тех же записей. На самом деле я хочу выбрать поля из [LONI]. [Dbo] .appointment_datas, но если встречи_ нет отсутствует в [GUONU]. [dbo] .dayend

Ответы [ 4 ]

4 голосов
/ 30 ноября 2009

SELECT DISTINCT удаляет дубликаты из вашего вывода.

Но ваш SQL выглядит неправильно. Вы уверены, что хотите написать:

TABLE1.FIELD1 <> TABLE1.FIELD1

Это всегда означает ложь. Я думаю, что у вас может быть ошибка в вашем SQL, и это может быть причиной того, почему вы получаете дублированные значения. Вы редко должны использовать <> в предложении объединения, и у вас не должно быть одинакового поля с обеих сторон.

Может быть, вы намеревались:

ON [DB1].[dbo].TABLE1.FIELD1 <> [DB2].[dbo].TABLE1.FIELD1

но это сгенерирует декартово произведение всех не совпадающих строк. Я сомневаюсь, что это то, что вы действительно имеете в виду. Возможно, вы хотите это:

ON [DB1].[dbo].TABLE1.ID = [DB2].[dbo].TABLE1.ID
WHERE[DB1].[dbo].TABLE1.FIELD1 <> [DB2].[dbo].TABLE1.FIELD1

Соответствует строкам из каждой базы данных, которые имеют одинаковый идентификатор, но отличаются в определенном столбце. Обратите внимание, что <> отсутствует в предложении JOIN.

--- ОБНОВЛЕНИЕ ---

Возможно, вы хотите выбрать результаты из двух разных баз данных, а затем объединить их?

SELECT appointment_datas.appointment_date 
        ,appointment_datas.appointment_no
        ,costumer_datas.costumer_name
        ,appointment_datas.appointment_type
        ,personel_datas.personel_ADI
FROM [LONI].[dbo].appointment_datas  
        INNER JOIN [LONI].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id
        INNER JOIN [LONI].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112)

UNION

SELECT appointment_datas.appointment_date 
        ,appointment_datas.appointment_no
        ,costumer_datas.costumer_name
        ,appointment_datas.appointment_type
        ,personel_datas.personel_ADI
FROM [GUONU].[dbo].appointment_datas  
        INNER JOIN [GUONU].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id
        INNER JOIN [GUONU].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112)

--- РЕШЕНИЕ ---

Использовать NOT EXISTS в предложении WHERE. Прочитайте комментарии, чтобы понять почему.

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

Линия

INNER JOIN [DB2].[dbo].TABLE1 ON TABLE1.FIELD1 <> TABLE1.FIELD1 

не имеет смысла, вы хотите перефразировать это ...

1 голос
/ 01 декабря 2009

Если я правильно понимаю ваш вопрос (после вашего редактирования)

но если имя_прибора не в [GUONU]. [DBO] .dayend

, вы действительно хотите NOT EXISTS подзапрос:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_close]
@DATE NVARCHAR(8)
AS
BEGIN
SELECT appointment_datas.appointment_date 
        ,appointment_datas.appointment_no
        ,costumer_datas.costumer_name
        ,appointment_datas.appointment_type
        ,personel_datas.personel_ADI
FROM [LONI].[dbo].appointment_datas  
        INNER JOIN [LONI].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id
        INNER JOIN [LONI].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112) = @DATE 
  AND NOT EXISTS (SELECT 'X' FROM [GUONU].[dbo].dayend WHERE dayend.appointment_no = appointment_datas.appointment_no)     
END
0 голосов
/ 30 ноября 2009

ВЫБЕРИТЕ DISTINCT TABLE1.FIELD1 , TABLE2.FIELD1 , TABLE1.FIELD3 , TABLE3.FIELD1 ОТ ...

Примечание: в некоторых вариантах вам придется заключить в скобки список полей, например
ВЫБЕРИТЕ DISTINCT (TABLE1.FIELD1 , TABLE2.FIELD1 , TABLE1.FIELD3 , TABLE3.FIELD1) ОТ ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...