SQL在NHibernate中使用“AND”查询的位置

时间:2014-07-04 16:16:17

标签: sql

我们知道" Where In" sql查询为输入执行OR。

抱歉,我无法上传图片..所以我创建了我的数据库视图的样子。 例如

<table>
<tr>
    <td>RoomBlockDateID</td>
    <td>RoomBlockID</td>
    <td>AvailableDate</td>
    <td>PublicRemaining</td>
</tr>
<tr>
    <td>2105</td>
    <td>633</td>
    <td>2009-10-14 00:00:00:000</td>
    <td>0</td>
</tr>
<tr>
    <td>2106</td>
    <td>633</td>
    <td>2009-10-15 00:00:00:000</td>
    <td>100</td>
</tr>
<tr>
    <td>2107</td>
    <td>633</td>
    <td>2009-10-16 00:00:00:000</td>
    <td>150</td>
</tr>
<tr>
    <td>2108</td>
    <td>633</td>
    <td>2009-10-17 00:00:00:000</td>
    <td>100</td>
</tr>

<tr>
    <td>2109</td>
    <td>635</td>
    <td>2009-10-14 00:00:00:000</td>
    <td>0</td>
</tr>
<tr>
    <td>2110</td>
    <td>635</td>
    <td>2009-10-15 00:00:00:000</td>
    <td>70</td>
</tr>
<tr>
    <td>2111</td>
    <td>635</td>
    <td>2009-10-16 00:00:00:000</td>
    <td>90</td>
</tr>
<tr>
    <td>2112</td>
    <td>635</td>
    <td>2009-10-17 00:00:00:000</td>
    <td>0</td>
</tr>

这是我做的事情

Select distinct RoomBlockID from Table where availabledate in ('10/14/2009', '10/15/2009', '10/16/2009') and PublicRemaining > 0

然后它将返回RoomBlockID 631和633.但是我在酒店预订系统中寻找的是,只有当publicrelocking是&gt; 0表示所有给定日期,然后返回正确的RoomBlockIDs。查看上面的查询,它将不返回任何内容。但是,如果我将查询修改为

Select distinct RoomBlockID from Table where availabledate in ('10/15/2009', '10/16/2009', '10/17/2009') and PublicRemaining > 0

然后它将返回631而不是633。

我可以使用光标并浏览每个Roomblockids并检查所有必需的日期是否仍然存在&gt; 0然后返回RoomBlockID。但我想知道是否有查询要这样做?

请指教。 谢谢

2 个答案:

答案 0 :(得分:0)

添加计数字段,并使用Having子句:

SELECT
  id,
  count(availableDate) as ct
FROM
  rooms
WHERE availableDate IN("2009-10-10","2009-10-11", "2009-10-12")
AND publicRemaining > 0
GROUP BY id
HAVING ct = 3

如果您筛选5个元素并添加contion ct = 5 - 这可确保有一个条目 每天。 (假设每个房间和每天只有一排)

此查询返回2个可能的房间:http://sqlfiddle.com/#!2/a714e/7

为此,它只有一个房间:http://sqlfiddle.com/#!2/a714e/10

(条件需要匹配IN()字段内的元素数量)

答案 1 :(得分:0)

如果您的数据库支持INTERSECT集合运算符(可能除非您使用MySQL),您可以使用:

select roomblockid
  from table
 where availabledate = '10/15/2009'
   and PublicRemaining > 0
intersect
select roomblockid
  from table
 where availabledate = '10/16/2009'
   and PublicRemaining > 0
intersect
select roomblockid
  from table
 where availabledate = '10/17/2009'
   and PublicRemaining > 0

如果没有,你可以使用:

Select RoomBlockID
  from Table
 where availabledate in ('10/15/2009', '10/16/2009', '10/17/2009')
   and PublicRemaining > 0
 group by RoomBlockID
having count(*) = 3