JOIN - 显示缺少的行,但将它们附加到特定列

时间:2013-09-18 17:35:30

标签: mysql sql sql-server

两张桌子

MEDIA_APPROVALS
[media_id] [firm_id] [approval_status]

FIRM_LIST
[firm_id] [firm_code]

最终目标是展示哪些媒体未被哪家公司批准。

默认情况下,MEDIA_APPROVALS表中列出的所有媒体都不会被FIRM_LIST表中列出的公司批准。因此,为了使媒体获得批准,该行必须包含firm_id,并且approval_status = 1.

如果媒体作品位于MEDIA_APPROVALS表格中,并且该行包含firm_id和approval_status = 0,这很容易 - 它未被批准。

对我来说很棘手的是:如果MEDIA_APPROVALS表中有一个关于media_id / firm_id连接的MISSING ROW,那么该media_id不会被批准用于该公司。

最终我想达到这个目的:

MEDIA_APPROVALS
100   1   1
100   2   1
101   1   0
101   2   0
101   3   1
102   1   1

FIRM_LIST
1   AA
2   BB
3   CC

QUERY OUTPUT
100   CC   0
101   AA   0
101   BB   0
102   BB   0
102   CC   0

我是PHP / Web程序员而不是数据库管理员。非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

所以你需要Media和Firm的所有可能组合?哦,这是一个交叉加入。我们不经常这样做:

WITH MediaFirms As (
    SELECT m_id.media_id, f_id.firm_id
    FROM (SELECT DISTINCT media_id FROM MEDIA_APPROVALS) m_id
    CROSS JOIN (SELECT DISTINCT firm_ID FROM FIRM_LIST) f_id
)
SELECT mf.media_id, mf.firm_id, coalesce(ma.approval_status, 0) "approval_status"
FROM MediaFirms mf
LEFT JOIN MEDIA_APPROVALS ma ON ma.media_id = mf.media_id AND ma.firm_id = mf.firm_id
WHERE coalesce(ma.approval_status,0) <> 1;