Предложение SQL NOT IN не работает

#sql #sql-server-2008 #syntax

#sql #sql-server-2008 #синтаксис

Вопрос:

Кто-нибудь видит, в чем проблема с этим кодом SQL? Я продолжаю получать красные подчеркивания вокруг строк FROM в запросе с ОБЪЕДИНЕНИЕМ. Если вы также можете рассказать мне, как я могу предотвратить дублирование кода, еще лучше!!

 DECLARE @collection_site_address_id INT;
SET @collection_site_address_id = 
(
    SELECT TOP 1
        client_address.addressid 
    FROM 
        dbo.ws_test_request
        INNER JOIN client ON ws_test_request.collection_site_id = client.identifyingnumber
        INNER JOIN client_address ON client.clientid = client_address.clientid
    WHERE 
        sample_specimen_id = @sample_identifyingnumber
        AND client_address.addresstypeid = 1
)

IF (

    (SELECT TOP 1
        client_address.addressid 
    FROM 
        dbo.ws_test_request
        INNER JOIN client ON ws_test_request.collection_site_id = client.identifyingnumber
        INNER JOIN client_address ON client.clientid = client_address.clientid
    WHERE 
        sample_specimen_id = @sample_identifyingnumber
        AND client_address.addresstypeid = 1
    )

    NOT IN (

        SELECT 
            [address].addressid
        FROM  
            [address]
            JOIN (
                SELECT 
                    client_address.addressid, 
                    client_address.addresstypeid, 
                FROM 
                    dbo.fnClientRelatives(@clientid, 0, 1, 0) relatives
                    INNER JOIN client_address on client_address.clientid = relatives.clientid
                    LEFT OUTER JOIN client ON relatives.clientid = dbo.client.clientid

                UNION

                SELECT 
                    contact_address.addressid, 
                    contact_address.addresstypeid, 
                FROM 
                    clientcontact 
                    INNER JOIN contact_address ON contact_address.contactid=clientcontact.contactid and clientcontact.clientid=@clientid
                    LEFT OUTER JOIN [contact] ON [clientcontact].contactid = [contact].contactid
                    LEFT OUTER JOIN [address] ON contact_address.addressid = address.addressid
            ) AS client_addressexternal ON client_addressexternal.addressid = address.addressid 
        WHERE  
            client_addressexternal.addresstypeid IN (3,1) 
    )
)
BEGIN
    @collection_site_address_id = @default_collection_site_address_id
END
  

========

Ответ:

После небольшого исследования это выглядит как более эффективный способ. Вы можете либо сравнить таблицу (результирующий набор) с другой таблицей (результирующим набором), используя предложение «IN» или «NOT IN». Или вы можете сравнить скаляр (он же переменная) с таблицей (результирующим набором), используя предложение «СУЩЕСТВУЕТ» или «НЕ СУЩЕСТВУЕТ».

[скалярный] СУЩЕСТВУЕТ ([таблица / набор результатов])
[скалярный] НЕ РАВЕН НУЛЮ И НЕ СУЩЕСТВУЕТ ([таблица / набор результатов])

или

[таблица / результирующий набор] В ([таблица / результирующий набор])
[таблица / результирующий набор] НЕ ВКЛЮЧЕНО ([таблица / результирующий набор])

 DECLARE @collection_site_address_id INT;
SET @collection_site_address_id = 
(
    SELECT TOP 1
        client_address.addressid 
    FROM 
        dbo.ws_test_request
        INNER JOIN client ON ws_test_request.collection_site_id = client.identifyingnumber
        INNER JOIN client_address ON client.clientid = client_address.clientid
    WHERE 
        sample_specimen_id = @sample_identifyingnumber
        AND client_address.addresstypeid = 1
)

IF      
    @collection_site_address_id IS NOT NULL AND NOT EXISTS
    (
        SELECT 
            [address].addressid
        FROM  
            [address]
            JOIN (
                SELECT 
                    client_address.addressid, 
                    client_address.addresstypeid
                FROM 
                    dbo.fnClientRelatives(@clientid, 0, 1, 0) relatives
                    INNER JOIN client_address on client_address.clientid = relatives.clientid
                    LEFT OUTER JOIN client ON relatives.clientid = dbo.client.clientid

                UNION

                SELECT 
                    contact_address.addressid, 
                    contact_address.addresstypeid 
                FROM 
                    clientcontact 
                    INNER JOIN contact_address ON contact_address.contactid=clientcontact.contactid and clientcontact.clientid=@clientid
                    LEFT OUTER JOIN [contact] ON [clientcontact].contactid = [contact].contactid
                    LEFT OUTER JOIN [address] ON contact_address.addressid = address.addressid
            ) AS client_addressexternal ON client_addressexternal.addressid = address.addressid 
        WHERE  
            client_addressexternal.addresstypeid IN (3,1) 
    )
BEGIN
    SET @collection_site_address_id = @default_collection_site_address_id
END
  

Ответ №1:

Удалите лишние запятые в списке полей. например, заменить

 ...
SELECT 
  client_address.addressid,
  client_address.addresstypeid,
FROM
...
  

с

 ...
SELECT 
  client_address.addressid,
  client_address.addresstypeid
FROM
...
  

Комментарии:

1. и я забыл НАБОР внутри лексической группы BEGIN / END

Ответ №2:

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

Т.е.:

 SELECT 
    client_address.addressid, 
    client_address.addresstypeid -- <-- trailing comma removed
FROM [...]

UNION

SELECT 
    contact_address.addressid, 
    contact_address.addresstypeid
FROM [...]