2011-09-07 4 views
4

SSMS에는 일반적으로 피할 수있는 쿼리 디자이너가 있습니다. 왜냐하면 솔직히 말해서 SSMS에는 실제로 작업 할 수 없기 때문입니다.SSMS의 쿼리 디자이너 및 조인 시퀀스 순서?

불행히도, 제 동료들이합니다. 30 분 남았으므로 마침내 내가 문제인지 SSMS인지를 알고 싶습니다.

예 : 테이블 건물, 테이블 층, 테이블 실 및 매핑 테이블 usage_types (room-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 

을 얻을 조인 수정하기 시작하는 경우가 아닌 모든 객실은 지금 ... necessarely

을) 일정 시간 동안] itselfs과 관련된 사용-유형이 이 쿼리는 동등한 것처럼 보일 지 모르지만 이것은 예제이며 대개 더 많은 테이블에 가입해야합니다. 따라서 특히 오른쪽 및 왼쪽 조인이 섞여있는 것을 좋아하지 않습니다. 결국 이해하기 어렵 기 때문에 (특히 여러 ON 문이 조인 된 부분에서 수행되지 않을 때) 버그를 거의 찾을 수 없게됩니다 (그리고 나는 내가 원하는 것을 알아내는 쿼리 디자이너의 능력에 대해 많은 신뢰를 갖지 못한다.)

나는 지금까지 내가 원하는 것처럼 '디자인'하는 방법을 찾지 못했습니다. 유일한 방법은 초기 쿼리를 만든 다음 SQL 텍스트를 가져온 다음 조인을 조정 한 다음 SQL 쿼리 디자이너로 다시 여는 것입니다.

결국이 작업은 처음부터 수동으로 수행하는 것보다 오래 걸리고 쿼리 디자이너가 SQL 스크립트를 수정 한 경우 처음에는 직접 다시 포맷하지 않아도 더 이상 읽을 수 없습니다. ..

내 변형이 쿼리 디자이너와 함께 성취하는 것이 완전히 불가능한 것처럼 보입니다. 쿼리 디자이너에서 조인 기호의 상황에 맞는 메뉴에서 가끔씩 테이블 왼쪽은 위쪽에, 때로는 오른쪽에있는 테이블입니다.

위의 그림 중 낮은 그림을 선택해야 할 경우 올바른 조인을 수행합니다. 나는 위의 것을 선택할 수있다. 그리고 나서 왼쪽 결합을하지만, 잘못된 순서로 ... 정확히 내가 원하지 않는 것은 ...

그래서 나는 묻고 싶다. : 거기에 어떤 '비밀 '어떤 테이블에서 쿼리를 시작해야하는지, 어떤 경우에는 제대로 조인하지 않을지를 지정하는 방법?

+5

내 제안 : QUERY DESIGNER를 사용하지 마십시오. 유감 스럽지만 유감 스럽지만 쓰레기통이며 왜 제품에서 잘라내는지 거부됩니다. 당신은 손으로 쓰는 것보다 오래 걸리는 것이 옳습니다. 또한 제출 된 모든 버그를 살펴보십시오. http://www.google.com/search?q=query+designer+site%3Aconnect.microsoft.com&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en -USA : 공식 및 클라이언트 = firefox-a # sclient = psy & hl = ko & client = firefox-a & hs = mJJ & rls = org.mozilla : ko-US % 3 공식 및 소스 = hp & q = query + 디자이너 + SSMS + 사이트 : connect.microsoft.com & pbx = 1 & oq = query + 디자이너 + SSMS + 사이트 : connect.microsoft.com –

답변

1

나는 Aaron의 의견에 동의하지만 어쨌든 다음 표의 정의를 사용해 보았습니다.창 "편집기에서 디자인 쿼리의"를 데리고 나는 당신이 그들을 선택 어떤 순서로 차이가 있음을 발견 클릭하는 동안 Ctrl 키를 누른 상태로 4 개 테이블을 추가

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)) 

.

당신이 만약 순서 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 위해 선택하는 경우에 당신은 훨씬 더 유망한

012와 끝까지

이 시작 지점부터 아니요 "건물의 모든 행 선택"을 클릭하면 아래의 쿼리로 변환됩니다.

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