SQL:无法形成查询

时间:2013-09-09 10:53:45

标签: sql

好的,我很难命名这个问题。但是很难用一个简单的标题来描述。

我有一个名为Stock的表,其中包含: 股票(BarCode,MagId,格式)

一张名为杂志的表格: 杂志(MagId,Title,ReleaseDate)

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

有些杂志只能在线或仅在印刷时使用。有些人都在。

我需要为仅从Stock表打印的杂志选择MagId。然后我需要列出他们的标题和发布日期。

所以,我开始:

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

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

任何人都能解释一下吗?

谢谢:)

2 个答案:

答案 0 :(得分: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'”。

答案 1 :(得分:1)

你确定吗,

Format = 'Print' AND Format <> 'Online'
对于Stock表中的任何行,

条件是否会成立?试试这个,

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

 Format = 'Print' 

以上条件将成为现实,

  1. 对于格式值等于print
  2. 的行

    我相信这就是你想要的。