SQL выбор из разных таблиц на основе логического - PullRequest
1 голос
/ 06 июля 2010

У меня есть простая хранимая процедура, например, так:

ALTER PROCEDURE [dbo].[spList_Report] 
  @id INT


AS 
  SET NOCOUNT ON 

  SELECT * 
  FROM 
    tblProducts as products 
  WHERE  
    product.intID = @id  

У меня есть 2 пользовательских таблицы: MainUser и SubUser Обе таблицы имеют столбец productID внешнего ключа, который связан с первичным ключом intID таблицы продуктов intID. У них обоих также есть столбец emailAddress. В таблице продуктов также есть битовый столбец isMainUser.

Как мне обновить мою хранимую процедуру, чтобы она возвращала столбец emailAddress на основе значения isMainUser? Таким образом, если значение равно true, он выбирает адрес электронной почты из таблицы MainUser, а если значение false, он выбирает адрес электронной почты из таблицы SubUser.

Например, мне нужен только один столбец адреса электронной почты:

ALTER PROCEDURE [dbo].[spList_Report] 
  @id INT


AS 
  SET NOCOUNT ON 

  SELECT 
    products.* 
  , myUser.emailAddress
  FROM 
    tblProducts as products 
  WHERE  
    product.intID = @id  

Ответы [ 2 ]

3 голосов
/ 06 июля 2010

Вы пропустили некоторую важную информацию.Я предполагаю, что

  • Products можно объединить с MainUser на UserProductID
  • Products можно объединить с SubUser на UserProductID
  • Для каждого продукта есть 1 основной пользователь. (скорее всего, нет, но об этом нужно будет указать, когда вы предоставите нам больше информации)
  • Для каждого продукта есть 1 субпользователь.

Оператор SQL

  SELECT  products.*  
          , CASE WHEN isMainUser=1 
            THEN MainUser.emailAddress 
            ELSE SubUser.emailAddress 
            END
  FROM    tblProducts as products  
          LEFT OUTER JOIN MainUser mu ON mu.UserProductID = products.UserProductID
          LEFT OUTER JOIN SubUser su ON su.UserProductID = products.UserProductID      
  WHERE   product.intID = @id   

Обратите внимание, что использование SELECT * считается плохой практикой.SELECT * никогда не должно присутствовать в производственном коде.

0 голосов
/ 06 июля 2010

Создайте представление для двух таблиц и присоединитесь к нему в вашем процессе

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