首页 > 解决方案 > sql查询过滤在另一个表中使用的行

问题描述

我有三张桌子...

表 1消息类型

表 2 businesschannel列:idBusinessChannel、idsystem、idMessageType、direction

表 3 partnersystemmessages的列:idSystem、idMessageType

我需要编写一个返回消息类型列表的查询,该列表散发出已经被合作伙伴系统消息(idSystem 列)表和业务渠道(方向列)使用的消息。

到目前为止,我有以下查询,它返回消息类型列表但忽略方向

SELECT    DISTINCT messagetype.*
FROM      messagetype
LEFT OUTER JOIN BUSINESSCHANNEL bc ON 
    bc.idMessageType = messagetype.idMessageType 
    AND bc.direction = 'out'
LEFT JOIN partnersystemmessages ON  
    messagetype.idMessageType = partnersystemmessages.idMessageType
      AND partnersystemmessages.idSystem = 522
WHERE     partnersystemmessages.idMessageType IS NULL 

更新 - 添加示例数据

messagetype
+--------------+----------+
| idMessageType| Name     | 
+--------------+----------+
| 1            | SMTP     | 
| 2            | EDI      | 
| 3            | AS2      | 
| 4            | WED      | 
| 5            | IDOC     | 
| 6            | general  | 
+--------------+----------+



businesschannel 
+------------------------+----------+---------------+------------+
| idpartnersystemmessages| idsystem | idMessageType | direction| |
+------------------------+----------+---------------+------------+
| 1859                   | 522      |     2         |  in        |
| 5131                   | 522      |     1         |  out       |
| 1773                   | 522      |     2         |  out       |
| 1775                   | 522      |     3         |  in        |
| 1777                   | 522      |     4         |  out       |
| 4555                   | 522      |     5         |  in        |
+------------------------+----------+---------------+------------+
partnersystemmessages 
+-------------------------+----------------+---------------+
| idpartnersystemmessages |MessageidSystem | |idMessageType|
+-------------------------+----------------+---------------+
| 1859                    |   522          |     2        |
| 5131                    |   522          |     1        |  
| 1773                    |   522          |     2        | 
| 1775                    |   522          |     3        |  
| 1777                    |   522          |     4        |  
| 4555                    |   522          |     5        |  
--------------------------+----------------+--------------+

对于 idSystem = 522 和方向 = 'out' 我期待:

 messagetype
+--------------+----------+
| idMessageType| Name     | 
+--------------+----------+
| 1            | SMTP     | 
| 3            | AS2      | 
| 5            | idoc     | 
| 6            | general  | 
+--------------+----------+

不包括已用于外向的 EDI 和 WEB

标签: sqltsql

解决方案


通过更改加入尝试如下

SELECT    DISTINCT m.*
FROM      messagetype m
LEFT OUTER JOIN BUSINESSCHANNEL bc ON 
    bc.idMessageType = m.idMessageType 
       JOIN partnersystemmessages ON  
     bc.idsystem= partnersystemmessages.idsystem
      AND partnersystemmessages.idSystem = 522

WHERE     bc.idMessageType IS NULL 

推荐阅读