gpt4 book ai didi

sql - SSMS 中的查询设计器和连接序列的顺序?

转载 作者:行者123 更新时间:2023-12-01 05:38:23 24 4
gpt4 key购买 nike

SSMS 有一个查询设计器,我通常会避免使用它,因为老实说,我无法真正使用它。

不幸的是,我的同事们这样做了。
由于我有30分钟的空闲时间,我终于想知道是我的问题还是SSMS。

例如:
假设我们有一个表建筑物、一个表楼层、一个表房间和一个映射表usage_types(房间使用类型)。

当我手动设计查询时,我这样做:

select all buildings, 
left join all floors in those buildings
left join all rooms in those floors
left join the room-usage_types mapping table.

现在,当我尝试在查询设计器中做同样的事情时,它以某种方式从映射表开始,然后左连接房间,左连接楼层,然后左连接建筑物。

这是根本性的缺陷,因为如果一个房间的映射表中没有条目,它不会返回所有房间(这是假设每个房间都必须在一个楼层中,并且每个楼层都必须在建筑物中,但不是每个房间必须具有与其自身相关联的使用类型 [在特定时间段内])...

现在,如果我开始修改连接,我会得到这个查询
SELECT  
FROM usage_type mapping
RIGHT OUTER JOIN Floors
LEFT OUTER JOIN Rooms
RIGHT OUTER JOIN Floors

现在这个查询看起来是等价的,但这是一个例子,通常,我必须加入更多的表。所以我不是特别喜欢左右连接的混合,因为最后很难理解(尤其是在连接的地方没有跟随几个 ON 语句时),使得搜索错误几乎不可能(而且我不太信任查询设计器找出我想要的东西的能力)。

到目前为止,我还没有找到像我想要的那样“设计”查询的方法。
唯一的方法似乎是创建初始查询,然后获取 SQL 文本,然后调整连接,然后使用 SQL 查询设计器重新打开它。

不用说,最后,这比最初手动执行要花费更长的时间,并且当查询设计器修改了 SQL 脚本时,如果不先手动重新格式化,就无法再阅读它......

在我看来,使用查询设计器完全不可能完成我的变体......
我还觉得奇怪的是,在查询设计器中,在连接符号的上下文菜单中,有时左侧的表在顶部,有时是右侧的表。

然后,当我必须选择较低的而不是较高的时,它会进行右连接。我可以选择上面的那个,然后它进行左连接,但是顺序错误……这正是我不想要的……

所以我想问:
是否有某种“ secret ”方式来指定查询将从哪个表开始,最好根本没有任何正确的连接?

最佳答案

我同意 Aaron 在评论中的评估,但我认为无论如何我都会使用下表定义进行查看。

CREATE TABLE buildings(
building_id int primary key)

CREATE TABLE floors(
floor_id int primary key,
building_id int references buildings)

CREATE TABLE rooms(
room_id int primary key,
floor_id int references floors)

CREATE TABLE room_usage_types(
room_id int references rooms,
usage_type_id int,
PRIMARY KEY (room_id,usage_type_id))

打开“在编辑器中设计查询”窗口并通过按住 CTRL 键同时单击来添加 4 个表,我发现选择它们的顺序会有所不同。

如果您在订单中选择 room_usage_types, rooms, buildings, Daily然后它开始你不是很有帮助
SELECT     
FROM rooms INNER JOIN
room_usage_types ON rooms.room_id = room_usage_types.room_id CROSS JOIN
buildings CROSS JOIN
Daily

但是如果您按顺序选择 buildings, floors, rooms, room_usage_types你最终会得到更有前途的
SELECT     
FROM buildings INNER JOIN
floors ON buildings.building_id = floors.building_id INNER JOIN
rooms ON floors.floor_id = rooms.floor_id INNER JOIN
room_usage_types ON rooms.room_id = room_usage_types.room_id

从这个起点做 不是 单击以“从建筑物中选择所有行”,因为它将查询转换为以下内容。
SELECT     
FROM rooms INNER JOIN
floors ON rooms.floor_id = floors.floor_id INNER JOIN
room_usage_types ON rooms.room_id = room_usage_types.room_id RIGHT OUTER JOIN
buildings ON floors.building_id = buildings.building_id

而是从 rooms, room_usage_types 之间的菱形开始从右到左工作并选择“从房间中选择所有行”等等。这似乎产生了预期的结果。
SELECT     
FROM buildings LEFT OUTER JOIN
floors ON buildings.building_id = floors.building_id LEFT OUTER JOIN
rooms ON floors.floor_id = rooms.floor_id LEFT OUTER JOIN
room_usage_types ON rooms.room_id = room_usage_types.room_id

关于sql - SSMS 中的查询设计器和连接序列的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7332621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com