2

好吧,我很难说出这个问题。但很难描述,所以用了一个简单的标题。

我有一个名为 Stock 的表,其中包含: Stock (BarCode, MagId, Format)

还有一个名为 magazines 的表,它有: Magazines (MagId, Title, ReleaseDate)

有两种杂志格式:印刷版和在线版

有些杂志只能在线获得或只能印刷。有些在两者上。

我需要为 Stock 表中仅打印的杂志选择 MagId。然后我需要列出他们的 Title 和 ReleaseDate。

所以,我开始了:

SELECT Title, ReleaseDate
FROM Magazines
WHERE MagId IN ( SELECT MagId
                    FROM Stock
                    WHERE Format = 'Print'
                    AND Format <> 'Online' );

我没有得到想要的结果。我认为是因为只选择印刷杂志的子查询是错误的。

任何人都可以解释一下吗?

谢谢 :)

4

2 回答 2

6

因为您只有两种格式,您可以通过获取所有没有“在线”格式的杂志来做到这一点:

SELECT Title, ReleaseDate
FROM Magazines
WHERE MagId NOT IN (SELECT MagId
                    FROM Stock
                    WHERE Format = 'Online' );

如果您有两种以上的格式,则可以Format = 'Onliine'Format in (<list goes here>)'.

编辑:

如果您想要一个版本,将其表达为“格式仅为 'Online'”的杂志,而不是“格式永远不是”的杂志'Online'):

SELECT m.Title, m.ReleaseDate
FROM Magazines m join
     (select MagId
      from Stock s
      group by MagId
      having  count(*) = sum(Format = 'Online')
     ) sm
     on m.MagId = sm.MagId;

having子句说“找到的所有格式都是'Online'”。

于 2013-09-09T10:56:52.047 回答
1

你确定吗,

Format = 'Print' AND Format <> 'Online'

Stock 表中的任何行的条件都将变为 true 吗?试试这个,

SELECT Title, ReleaseDate
FROM Magazines
WHERE MagId IN ( SELECT MagId
                FROM Stock
                WHERE Format = 'Print');

 Format = 'Print' 

上述条件将变为真,

  1. 对于格式值等于打印的行

我相信这就是你想要的。

于 2013-09-09T11:08:42.723 回答