0

我正在使用一个 SQL 数据库,它是一个 DBMS。它的歌词数据库。(如果我的描述不充分,我很乐意澄清)。

我的 salespeople 表(带有 salesids)如下:

销售人员:

SalesID | FirstName | LastName
------- | --------- | --------
        |           |

我的工作室表如下:

工作室:

StudioID | Name | City | Contact | SalesID
-------- | ---- | ---- | ------- | -------
         |      |      |         |

我已通过以下方式启动查询:

select st.salesid, coalesce(sp.salesid, 'Does Not Work')
--Does This Match Harry Lee?
from studios st
inner join salespeople sp on sp.salesid = st.salesid;

还有:

select st.*
from studios st
inner join salespeople sp
    on sp.salesid = st.salesid
where st.contact = "Harry Lee";

但我不确定是否要重新标记该列。我知道要关联列(正如我在上面的查询中使用 coalesce 函数暗示的那样)。

但是,如何在仍然遵守问题细节的同时将其包含在先前的查询中?再说一次,如果我的描述不充分,我很乐意澄清这个问题。

4

2 回答 2

1

真的很难说出你想要什么,但也许这会做:

select *
from SalesPeople s
where exists (
   select 1
   from   Studios
   where  Studios.SalesID = s.SalesID
      and Contact = 'Harry Lee'
   )

这是基于问题第二句中所述的要求,而不是您显示的代码示例(这有点令人困惑)。

编辑: 阅读您修改后的问题,试试这个:

select distinct a.SalesID
    . case when b.SalesID is null
           then 'doesn't work with Harry'
           else 'works with Harry'
           end as "Harry?"
from SalesPeople a
left outer join Studios b 
on   b.SalesID = a.SalesID
 and b.Contact = 'Harry Lee'
于 2013-11-03T01:02:28.877 回答
0

在您的情况下coalesce(sp.salesid, 'Does Not Work With Harry Lee')将始终返回sp.salesid。这样做的原因是您使用的INNER JOINwhich 根据定义只会在匹配存在时返回一行。它不会返回空值。

您的陈述是正确的,只是稍作改动:使用OUTER JOIN. 您可以在此处阅读有关它的更多信息以及两者之间的区别。

尝试使用以下内容。这将返回以 Harry Lee 作为联系人的所有可用 salesid 以及所有不返回 where 的 salesid Does Not Work With Harry Lee

SELECT st.salesid, COALESCE(sp.salesid, 'Does Not Work With Harry Lee')
FROM studios st
LEFT JOIN salespeople sp ON sp.salesid = st.salesid;
WHERE st.contact = "Harry Lee";

如果您只对以salesidsHarry Lee 作为联系人的方式感兴趣,请使用以下内容:

SELECT st.salesid
FROM studios st
INNER JOIN salespeople sp ON sp.salesid = st.salesid;
WHERE st.contact = "Harry Lee";

编辑 :

在您上次编辑之后,为了获得该结果,您应该使用以下内容。您可以使用以下WHERE子句控制查询结果:

SELECT st.salesid, 'works with Harry' AS [Harry?]
FROM studios st
INNER JOIN salespeople sp ON sp.salesid = st.salesid;
WHERE st.contact = "Harry Lee";

UNION ALL

SELECT st.salesid, 'doesn't work with Harry' AS [Harry?]
FROM studios st
INNER JOIN salespeople sp ON sp.salesid = st.salesid;
WHERE st.contact <> "Harry Lee";
于 2013-11-03T01:22:23.677 回答