Выбор таблицы для использования в предложении FROM на основе определенного условия - PullRequest
2 голосов
/ 02 ноября 2019

У меня есть следующая схема:

Purchase             : pur_dt | pur_amt | item_code | quantity 
ItemListForSoftware  : item_code | item_desc | ...
ItemListForHardware  : item_code | item_desc | ...

Теперь мне нужно выбрать item_desc из любой из таблиц Item на основе item_code of Purchase.

Если item_code начинается с S, тоон должен искать в ItemListForSoftware еще из ItemListForHardware

Примерно так

if(item_code starts with S){
 select pur_dt,pur_amt,item_desc,quantity from Purchase, ItemListForSoftware where Purchase.item_code=ItemListForSoftware.item_code
}else{
  select pur_dt,pur_amt,item_desc,quantity from Purchase, ItemListForHardware where Purchase.item_code=ItemListForHardware.item_code
}

Есть ли способ сделать это с помощью одного SQL-запроса?

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Вы можете решить эту проблему, LEFT JOIN используя обе таблицы и используя item_code, чтобы выбрать соответствующие данные:

SELECT p.pur_dt, p.pur_amt, 
       CASE WHEN LEFT(p.item_code, 1) = 'S' THEN s.item_desc
            ELSE h.item_desc
       END AS item_desc
       p.quantity
FROM Purchase p
LEFT JOIN ItemListForSoftware s ON p.item_code=s.item_code
LEFT JOIN ItemListForHardware h ON p.item_code=h.item_code
1 голос
/ 02 ноября 2019

На самом деле это так же просто, как вы написали:

select
  pur_dt,
  pur_amt,
  case
    when left(item_cide, 1) = 'S' then
      (select item_desc from ItemListForSoftware as d where d.item_code = p.item_code)
    else
      (select item_desc from ItemListForHardware as d where d.item_code = p.item_code)
  end as item_desc,
  quantity
from Purchase as p;

Конечно, это будет работать, только если в таблицах ItemListForSoftware и ItemListForHardware имеется только 0 или 1 строка.

PS: обратите внимание, что это может быть немного быстрее, чем объединение трех таблиц.

1 голос
/ 02 ноября 2019

Это то, что вы хотите?

select p.pur_dt, p.pur_amt,
       coalesce(ifs.item_desc, ifh.item_desc) as item_desc,
       p.quantity
from Purchase p left join
     ItemListForSoftware ifs
     on p.item_code = ifs.item_code and
        p.item_code like 'S%' left join
     ItemListForHardware ifh
     on p.item_code = ifh.item_code and
        p.item_code not like 'S%';

Обратите внимание на правильный синтаксис JOIN.

...