除了mysql中的替换?
我必须用mysql写一些代码,但我主要是用MS SQL写的,这里有个问题,在MS SQL中我可以使用,除了,一切对我来说都很好。但在MySQL中并没有这么简单,我尝试了notin和notexists,但它没有给我相同的输出。我的MS SQL代码是:除了mysql中的替换?,mysql,Mysql,我必须用mysql写一些代码,但我主要是用MS SQL写的,这里有个问题,在MS SQL中我可以使用,除了,一切对我来说都很好。但在MySQL中并没有这么简单,我尝试了notin和notexists,但它没有给我相同的输出。我的MS SQL代码是: SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE FROM Room P LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom JOIN Hotel H ON P.IDHo
SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
JOIN Hotel H ON P.IDHotelu = H.IDHotelu
WHERE P.NumberOfBeds = 2 AND H.IDHotelu = 2
EXCEPT
SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P JOIN Reservation R ON P.IDRoom = R.IDRoom
WHERE '2017-12-10' BETWEEN DataB AND DataE;
就像你可以看到的,我在寻找有两张床的酒店,酒店id是2。但我不想看到已经预订的房间,所以我使用Exception并查找已预订的房间。。。但是在MS SQL中很容易,在MySQL中没有任何东西适合我。有什么想法吗?我通常创建一个子查询,并使用左连接将外部表连接到它。然后,您可以将一个WHERE列设置为NULL
SELECT
P.IDRoom
,R.IDRoom
,R.DateB
,R.DataE
FROM
Room P
LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
INNER JOIN Hotel H ON P.IDHotelu = H.IDHotelu
LEFT JOIN (
SELECT
P.IDRoom AS IDRoom1
,R.IDRoom AS IDRoom2
,R.DateB
,R.DataE
FROM
Room P
JOIN Reservation R ON P.IDRoom = R.IDRoom
WHERE
'2017-12-10' BETWEEN DataB AND DataE
) AS e ON P.IDRoom = e.IDRoom1 AND R.IDRoom = e.IDRoom2 AND R.DateB = e.DateB AND R.DataE = R.DataE
WHERE
P.NumberOfBeds = 2 AND H.IDHotelu = 2
AND e.IDRoom1 IS NULL
以下查询的行为应类似于
这是正确的方向。请发布您的MySQL查询,以便我们可以查看它,因为SQL Server查询正在运行,对MySQL结果没有影响。不存在确实是正确的方向,具有明显的。。。选择不同的。。。从…起不存在。。。EXCEPT返回EXCEPT运算符左侧查询中的任何不同值,这些值不是从右侧查询返回的。来源我试过从P房间选择P.IDRoom,R.IDRoom,R.DateB,R.DateE从P房间左加入预订R在P.IDRoom=R.IDRoom加入酒店H在P.IDHotelu=H.IDHotelu其中P.NumberOfBeds=2和H.IDHotelu=2且不存在从预订中选择DateB,DateE在DateB和DateE之间的“2017-12-10”;当我尝试与不同的日期谁没有预定它的工作。。。显示所有行,但当我尝试检查是否排除已预订的行时,所有行都消失了。。。。所以我的逻辑有错误。谢谢,它在工作。我只是想知道我的逻辑错误在哪里,但我将首先分析这段代码MySQL没有EXCEPT函数。因此,您只需在子查询中保留JOIN,并请求子查询中没有匹配记录或为NULL的任何行。
SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P
LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
JOIN Hotel H ON P.IDHotelu = H.IDHotelu
WHERE P.NumberOfBeds = 2 AND H.IDHotelu = 2
AND NOT EXISTS (
SELECT 1
FROM Room i_P
JOIN Reservation i_R ON i_P.IDRoom = i_R.IDRoom
WHERE '2017-12-10' BETWEEN DataB AND DataE
AND i_P.IDRoom = P.IDRoom
)