#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 [...]