将两位比较为一位

时间:2017-10-02 17:55:17

标签: sql

我有一个查询,如果该位置有效,我需要在商店中提取所有基本和季节性头寸:

Select ojr.StoreNumber, ojr.Seasonal, ojr.JobType
FROM OJR ojr
Inner Join OJR_StoreInfo si on ojr.StoreNumber = si.Storenumber AND 
  CASE WHEN si.Seasonal-Barista = 1 Then 1 WHEN si.Base-Barista = 1 
  Then 0 ELSE NULL END = ojr.Seasonal

表结构如下:

OJR

ID  StoreNumber  Seasonal  JobType
___________________________________
1  71001        0         Barista
2  71001        1         Barista
3  71002        0         Barista
4  71002        0         Sales

StoreInfo

StoreNumber  Base-Barista  Seasonal-Barista  Base-Sales  Seasonal-Sales
_______________________________________________________________________
71001        1             1                 1           0
71002        0             1                 1           1
71003        0             0                 0           0

所以问题在于,当我运行上面的查询时,ID 1没有进来,因为Storeinfo同时接收季节性和基本的baristas,但INNER JOIN确定我正在寻找季节性因为它击中了第一个什么时候进入“结束”,永远不会到达第二个时间。还有另一种方法可以解决这个问题吗?我认为内连接需要一个子查询,但我还是想不通。

期望的输出:

StoreNumber  Seasonal  JobType
__________________________________
71001        0         Barista
71001        1         Barista
71002        0         Sales

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以在不使用case表达式的情况下重新制定加入条件,如下所示:

SELECT
    ojr.StoreNumber
,   ojr.Seasonal
,   ojr.JobType
FROM OJR ojr
INNER JOIN OJR_StoreInfo si
   ON ojr.StoreNumber = si.Storenumber
 AND ((si.Seasonal-Barista = 1 AND ojr.Seasonal=1) OR (si.Base-Barista = 1 AND ojr.Seasonal=0))

上述条件消除了提出与ojr.Seasonal匹配的数字的需要,将其替换为两个独立的逻辑条件。