所以我的销售订单中的每个项目都有一个表格,其中包含商品ID或只是描述(如果它不是真实商品),表格如下所示:
SalesOrderLine:
|ID | SOI_IMA_RecordID | SOI_LineNbrTypeCode | SOI_MiscLineDescription |
|1 | 2 | Item | XYZ |
|2 | NULL | GL Acct | Description |
|3 | NULL | GL Acct | Descrip |
|4 | 20 | Item | ABC |
我想要做的是,如果它不是真项(具有SOI_IMA_RecordID = NULL和/或SOI_LineNbrTypeCode = GL Acct)不与我的Item表内连接并获取SOI_MiscLineDescription而不是项目名称(IMA_ItemName in我的询问)。
我的查询如下:
SELECT SOH_ModifiedDate,
SOM_SalesOrderID,
IMA_ItemName,
SOH_SOD_RequiredDate,
SOD_RequiredDate,
SOH_SOD_DockDate,
SOD_DockDate,
SOH_SOD_PromiseDate,
SOD_PromiseDate,
SOH_SOD_RequiredQty,
SOD_RequiredQty,
SOH_SOD_UnitPrice,
SOD_UnitPrice
FROM WSI_SOH SOH
INNER JOIN SalesOrderDelivery SOD ON SOH.SOH_SOD_RecordID = SOD.SOD_RecordID
INNER JOIN SalesOrder SO ON SO.SOM_RecordID = SOD.SOD_SOM_RecordID
INNER JOIN SalesOrderLine SOI ON SOI.SOI_RecordID = SOD.SOD_SOI_RecordID
INNER JOIN Item ITE ON ITE.IMA_RecordID = SOI.SOI_IMA_RecordID
怎么做?
答案 0 :(得分:2)
您可以在CASE
中使用SELECT
声明:
SELECT CASE WHEN SOI_IMA_RecordID IS NULL OR
SOI_LineNbrTypeCode = 'GL Acct'
THEN SOI_MiscLineDescription
ELSE IMA_ItemName
END ItemName,
-- ...
FROM WSI_SOH SOH
INNER JOIN SalesOrderDelivery SOD ON SOH.SOH_SOD_RecordID = SOD.SOD_RecordID
INNER JOIN SalesOrder SO ON SO.SOM_RecordID = SOD.SOD_SOM_RecordID
INNER JOIN SalesOrderLine SOI ON SOI.SOI_RecordID = SOD.SOD_SOI_RecordID
LEFT JOIN Item ITE ON ITE.IMA_RecordID = SOI.SOI_IMA_RecordID AND
SOI_IMA_RecordID IS NOT NULL AND
SOI_LineNbrTypeCode != 'GL Acct'
答案 1 :(得分:0)
left join
允许您在on
条件匹配时加入,并且在不是的情况下仍然只显示联接右侧的列 - 在您的情况下,{ {1}}是SOI_IMA_RecordID
:
null
答案 2 :(得分:0)
将您的INNER JOIN
更改为LEFT JOIN
并使用CASE
获取所需的值:
SELECT SOH_ModifiedDate,
...
CASE
WHEN IMA_ItemName IS NULL THEN SOI_MiscLineDescription
ELSE IMA_ItemName END AS ItemName,
...
FROM WSI_SOH SOH
...
LEFT JOIN Item ITE ON ITE.IMA_RecordID = SOI.SOI_IMA_RecordID AND SOI_IMA_RecordID IS NOT NULL
这样,只有匹配的记录才会加入Item
表,当没有匹配的记录时,字段为NULL
。当CASE
表格不是Item
时,NULL
会从listSplit
表中选择字段,否则会选择说明。
编辑 - 当我输入答案时,我看到有两个人在我面前!
答案 3 :(得分:0)
因为您在项目上使用了INNER JOIN,所以SalesOrderLine中没有相应ITE.IMA_RecordID的任何行都不会出现在您的最终查询中。
相反,对项使用LEFT JOIN,并使用确定要使用的描述的函数,或者只返回两列(SalesOrder Line中的描述和Item中的描述。)
我对SQL Server函数不太熟悉,但在PostGres和MySql中,这些函数就像COALESCE()(在字段列表中返回第一个非空值)
我相信你可能想在这里使用case语句,比如
case when item.description!=null
then item.description
else SalesOrderLine.SOI_MiscLineDescription
end