Объединить 3 SQL SELECT в 1

#sql #sql-server #sql-server-2005 #tsql #stored-procedures

#sql #sql-сервер #sql-server-2005 #tsql #хранимые процедуры

Вопрос:

* ОБНОВИТЬ *

Извините! Я был немного занят и спешил, поэтому не прояснил это должным образом.

По сути, все 3 очереди относятся к сведениям о пользователях. Я обновляю сайт для нового клиента, где я ограничен текущей структурой базы данных. Таким образом, моя цель — попытаться получить всю эту информацию в одном вызове db, а не в 3 отдельных, поскольку это, по-видимому, наиболее эффективный способ из двух.

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

Спасибо за ваше время.


Общим значением является @dealerId, которое является значением int.

Спасибо

     SELECT TOP(100) PERCENT dbo.ReferenceItems.Title 
    FROM dbo.AdvertiserLanguageLink 
    INNER JOIN dbo.ReferenceItems 
    ON dbo.AdvertiserLanguageLink.LanguageId = dbo.ReferenceItems.Id
    WHERE (dbo.AdvertiserLanguageLink.AdvertiserId = @dealerId) 
    ORDER BY dbo.ReferenceItems.Title



    SELECT TOP (100) PERCENT dbo.AircraftTypes.AircraftTypeDescription, dbo.AircraftTypes.AircraftTypeId 
    FROM dbo.AdvertiserAircraftTypeLink 
    INNER JOIN dbo.AircraftTypes 
    ON dbo.AdvertiserAircraftTypeLink.AircraftTypeId = dbo.AircraftTypes.AircraftTypeId 
    WHERE (dbo.AdvertiserAircraftTypeLink.AdvertiserId = @dealerId) 
    ORDER BY dbo.AircraftTypes.SortSequence



    SELECT TOP (1) dbo.Addresses.Country, dbo.Addresses.Telephone1 
    FROM dbo.AdvertiserAddressLink 
    INNER JOIN dbo.Addresses 
    ON dbo.AdvertiserAddressLink.AddressId = dbo.Addresses.Id 
    WHERE (dbo.AdvertiserAddressLink.AdvertiserId = @dealerId) 
    AND (dbo.Addresses.AddressType = 1 OR dbo.Addresses.AddressType = 0) 
    ORDER BY dbo.Addresses.Sequence
  

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

1. Каждый из этих операторов select выдает совершенно разные выходные данные. Можете ли вы привести краткий пример того, как будет выглядеть желаемый результат?

2. Это глупый вопрос, но я не думаю, что он заслуживает понижения. Я думаю, OP немного смущен тем, что он хочет сделать.

3. @Peter: @akram: или оставьте это, чтобы вы навсегда запомнили, вы и ваши правнуки, не торопитесь 🙂

4. @ypercube : смехотворно. Однако, когда вы знаете и сожалеете, что были неправы, когда набирали отрицательные голоса.

5. @Andriy: да, я жду, когда будет добавлен Resist Peer Pressure один 🙂

Ответ №1:

Вы не можете / не должны их объединять.

Вы выбираете очень разные данные из разных таблиц во всех 3. Похоже, что они совершенно не связаны. Как, по-вашему, должен выглядеть «объединенный» результирующий набор? Вы объединяете информацию о книгах, самолетах и телефоне?

Какова именно ваша цель? Если вы скажете нам, что мы, возможно, сможем указать вам другой (правильный) путь к нему.

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

1. @Phil — Я все еще не думаю, что вам следует их объединять … возможно, вы можете поместить это в сохраненный процесс, который возвращает 3 набора результатов, если вы передадите ему dealerid в качестве параметра.

2. Это то, что я, по сути, сейчас сделал. Спасибо за ваше время.

Ответ №2:

Я просто делаю вывод здесь, но вы либо …
1. Просто хотите сделать код более кратким.
2. Хотите, чтобы выходные данные имели согласованную подпись (те же поля и т.д.).

В случае 1. я бы оставил ваш код как есть. Каждый запрос индивидуален, и разделение их с помощью операторов IF делает понятным, что существует три пути выполнения.

Последнее часто желательно в случае фреймворков привязки данных, которые автоматизируют часть работы программистов. Если это так, я бы все равно оставил код с инструкциями IF. Если затем вы явно ПРИВЕДЕТЕ каждое поле к одному и тому же типу (например, INT или VARCHAR (256) и т.д.), А затем убедитесь, что каждый раз используются одни и те же имена полей (например, ID или Name и т.д.), То вы получите одну и ту же подпись для каждого пути выполнения.

Редактировать:

Я все еще не совсем уверен в том, чего вы хотите достичь и, более конкретно, с какими проблемами вы сталкиваетесь.

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

Итак, я подозреваю, что проблемы, с которыми вы сталкиваетесь, вообще не связаны с SQL, а скорее с вашим приложением. Какой язык вы используете? Как вы в настоящее время получаете доступ к наборам записей? С какими проблемами вы сталкиваетесь, когда SP возвращает 3 набора записей? И т.д. и т.п…