您可以使用从另一个查询中的查询获得的数据吗?

时间:2016-01-12 23:17:13

标签: sql sql-server

说我从SELECT查询中获得了一些数据。我可以稍后将其用作表格,这意味着在其他查询中使用其行和列来命名它吗?

我无法为我的生活解决这个问题。我是初学者。它只是一个表,但我无法查询工作。这就是我所拥有的:

酒店餐桌和房间餐桌(我只需要使用房间餐桌;我提到酒店只是作为理解的参考点)。

Room包含以下列:(Number,HID) - 这是一个复合主键; Number是房间的数字,HID是它所属的酒店的ID。我还有一个专栏名称。现在的问题是:

查找所有仅拥有名为OneBedroom的房间的酒店

我通过选择Room中的所有HID,然后过滤不存在​​(至少有一个非OneBedroom命名的房间的酒店)来尝试(并且失败),但我无法使其工作。

Room

Number    HID    Name

1         H1     OneBedroom
2         H2     OneBedroom
3         H1     OneBedroom
4         H1     OneBedroom
5         H2     TwoBedroom
6         H3     OneBedroom

Desired Output:    HID
           H1
           H3

3 个答案:

答案 0 :(得分:2)

我怀疑这样的事情会这样做

SELECT DISTINCT `hid` FROM `room` WHERE
    `room`.`hid` NOT IN
        (SELECT `hid` as `hid` FROM `room` WHERE `name` != "OneBedroom");

未经测试,可能是垃圾,但似乎它应该工作。基本上,内部查询会获得不是hid s的所有OneBedroom个房间。然后,我们会从hid的完整列表中减去所有这些hid

答案 1 :(得分:1)

我按照你所描述的那样使用这样的表:

table Room
HID    Number        Name
----------------------------------------
 1      101          OneBedroom
 1      102          OneBedroom
 1      103          TwoBedroom
 1      201          Suite
 2      101          OneBedroom
 2      102          OneBedroom
 2      103          OneBedroom

我假设连接到一张桌子酒店:

table Hotel
HID    name
------------------
 1     StayOver
 2     SleepTite

现在查询:

SELECT h.name 
FROM Hotel h
WHERE h.HID NOT IN (SELECT r.HID 
FROM Room r
WHERE name != 'OneBedroom');

将为您提供仅有一间卧室的酒店名称列表。

在SQLite上使用示例数据。应该没事。

编辑 - 基于已编辑的问题:

SELECT h.HID . . . 

而不是上面查询中的h.name。

答案 2 :(得分:1)

最简单的方法是使用group byhaving条件count,因此无需包含aditional子查询。

此返程酒店全部为room = "OneBedroom",请记住COUNT仅计算values <> NNLL

 SELECT `hid` 
 FROM `room`
 GROUP BY `hid`
 HAVING COUNT(CASE WHEN `name` != "OneBedroom" THEN 1 END ) = 0

至少有一间卧室是电话&#34; OneBedroom&#34;`

 HAVING COUNT(CASE WHEN `name`  = "OneBedroom" THEN 1 END ) >= 1

CASE的默认值为NULL,因此无需ELSE部分