[SQL] 두 개의 서로 다른 결과 집합을 받고 이러한 두 개의 쿼리의 차이는 무엇입니까?
SQL두 개의 서로 다른 결과 집합을 받고 이러한 두 개의 쿼리의 차이는 무엇입니까?
나는이 두 개의 쿼리에 대해 서로 다른 결과 집합을 얻고있다 및 두 번째 결과 집합은 올바른 것 같다. 이러한 쿼리의 차이는 무엇인가.
내부의 어떤 종류의 쿼리 두 번째 조인?
1)
FROM TABLE1 t1
INNER JOIN TABLE2 t2 ON t1.Id = t2.Id
WHERE
t1.StatusId = 12
2)
FROM TABLE1 t1
INNER JOIN TABLE2 t2 ON t1.Id = t2.Id
AND t1.StatusId = 12
해결법
-
==============================
1.정말 당신이 가입 내부에서 이렇게 차이가 없습니다.
정말 당신이 가입 내부에서 이렇게 차이가 없습니다.
당신이 왼쪽 또는 오른쪽이 조인을 사용 그러나, 그것은 당신이 (가) 가입으로 또는 WHERE 절에 추가 필터를 넣어 여부를 차이를 만들 않습니다.
당신이 WHERE 절에 필터를 넣을 때, SQL Server는 필터가 맞지 않는 행을 필터링 완전히 후 처음 가입하지합니다. ->이 반환되는 행의 수를 줄일 수
조인에 필터를 넣을 때, SQL Server는 가입시 필터링을한다,하지만 필터를 넣어 테이블에. 당신은 여전히 다른 테이블에서 모든 행을 얻을 수 있지만, 만 필터링 된 테이블 필터 맞는에서 데이터를 가지고있다. ->이 행의 수를 줄일되지 않지만 filteres 테이블의 데이터로 열이 많은 행에서 비어있을 것입니다
그것은 여기, 좀 더 명확하게하기 위해 ... 설명하기 어려운 예입니다 :
RedFilter의 대답에서 샘플 데이터를 가지고 :
CREATE TABLE [dbo].[t1]( [ID] [int] NULL, [StatusID] [int] NULL ) ON [PRIMARY] CREATE TABLE [dbo].[t2]( [ID] [int] NULL ) ON [PRIMARY] INSERT INTO t1 (ID, StatusID) VALUES (1, 10) INSERT INTO t1 (ID, StatusID) VALUES (2, 11) INSERT INTO t1 (ID, StatusID) VALUES (3, 12) INSERT INTO t1 (ID, StatusID) VALUES (4, 12) INSERT INTO t2 (ID) VALUES (1) INSERT INTO t2 (ID) VALUES (3) INSERT INTO t2 (ID) VALUES (5)
... 그리고 그것에서 다음 쿼리를 실행 :
/* this returns four rows, but only two will have data from the second table in the second column */ SELECT t1.ID, t2.ID FROM t1 LEFT JOIN t2 ON t1.Id = t2.Id /* this returns only one row: the one where t2.ID = 1 */ SELECT t1.ID, t2.ID FROM t1 LEFT JOIN t2 ON t1.Id = t2.Id WHERE t2.ID = 1 /* this returns four rows as in the first query, but only one row will have data in the second column: the one where t2.ID = 1 */ SELECT t1.ID, t2.ID FROM t1 LEFT JOIN t2 ON t1.Id = t2.Id AND t2.ID = 1
코멘트에 표시된대로 다른 결과를합니다.
-
==============================
2.이 쿼리는 동일한 결과를 반환해야합니다. 전체 쿼리를 게시하시기 바랍니다.
이 쿼리는 동일한 결과를 반환해야합니다. 전체 쿼리를 게시하시기 바랍니다.
다음은 두 가지 변형 중 동일한 출력을 보여주는 샘플이다 :
견본:
CREATE TABLE [dbo].[t1]( [ID] [int] NULL, [StatusID] [int] NULL ) ON [PRIMARY] CREATE TABLE [dbo].[t2]( [ID] [int] NULL ) ON [PRIMARY] INSERT INTO t1 (ID, StatusID) VALUES (1, 10) INSERT INTO t1 (ID, StatusID) VALUES (2, 11) INSERT INTO t1 (ID, StatusID) VALUES (3, 12) INSERT INTO t1 (ID, StatusID) VALUES (4, 12) INSERT INTO t2 (ID) VALUES (1) INSERT INTO t2 (ID) VALUES (3) INSERT INTO t2 (ID) VALUES (5) SELECT t1.ID, t1.StatusID FROM t1 INNER JOIN t2 ON t1.Id = t2.Id WHERE t1.StatusId = 12 SELECT t1.ID, t1.StatusID FROM t1 INNER JOIN t2 ON t1.Id = t2.Id AND t1.StatusId = 12
산출:
ID StatusID ----------- ----------- 3 12 (1 row(s) affected) ID StatusID ----------- ----------- 3 12 (1 row(s) affected)
-
==============================
3.질문의 편집 역사를 보면 당신의 쿼리는 다음과 같은 라인을 따라있는 것으로 보인다.
질문의 편집 역사를 보면 당신의 쿼리는 다음과 같은 라인을 따라있는 것으로 보인다.
쿼리 하나
INNER JOIN dbo.T2 ON ... LEFT OUTER JOIN dbo.T3 ON ... WHERE T3.col = somevalue AND ...
쿼리 두
INNER JOIN dbo.T2 ON ... LEFT OUTER JOIN dbo.T3 ON ... AND T3.col = somevalue WHERE ...
그들 사이의 차이는 쿼리 하나는 효과적으로 LEFT는 INNER 가입에 가입 변환하는 것입니다.
왼쪽 외부 개념적으로 다음과 같은 상황이 발생 가입 할 수 있습니다.
우리 모두가 이러한 행이 컬럼의 값이 NULL 인 것을 알고 2 단계에서 다시 추가 이러한 행의 아무도는 3 단계에서 T3.col = someValue와 조건을 충족하지 않습니다.
-
==============================
4.SQL은 선언적 언어이며, 그것은 당신의 쿼리를 구현하는 DBMS까지입니다. 는 SQL Server 쿼리 옵티마이, 표현 가입 당신은을 사용하여 두 테이블을 내부 조인 여부를 WHERE 표현, IN 식을 상관하지 않는다 또는 표현 존재, 내부적으로는 모두 같은 처리됩니다. SQL Server는 행 수와 데이터 분포들을 선언하는 데 사용되지 정확한 구문에 기초하여 선택된 3 개의 내부 조인 알고리즘을 갖는다. 당신이 당신의 예에서 두 쿼리의 실행 계획을 비교하면 당신은 그들이 동일한 것을 발견한다, 따라서 동일한 결과 집합을 생성합니다.
SQL은 선언적 언어이며, 그것은 당신의 쿼리를 구현하는 DBMS까지입니다. 는 SQL Server 쿼리 옵티마이, 표현 가입 당신은을 사용하여 두 테이블을 내부 조인 여부를 WHERE 표현, IN 식을 상관하지 않는다 또는 표현 존재, 내부적으로는 모두 같은 처리됩니다. SQL Server는 행 수와 데이터 분포들을 선언하는 데 사용되지 정확한 구문에 기초하여 선택된 3 개의 내부 조인 알고리즘을 갖는다. 당신이 당신의 예에서 두 쿼리의 실행 계획을 비교하면 당신은 그들이 동일한 것을 발견한다, 따라서 동일한 결과 집합을 생성합니다.
-
==============================
5.후드의 차이는 모든 조인 후 WHERE 절에 액세스 할 때이다.
후드의 차이는 모든 조인 후 WHERE 절에 액세스 할 때이다.
어쩌면이 경우이 차이 없지만 여러 조인이있을 때 그것이 항상 진실되지 않을 것이 의미합니다. 이들은 처리 곳 전에 가상 결과 집합 (상황)에 따라 아웃 고려 될 수있다.
http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/ : 친절이 링크를 참조
-
==============================
6.나는 그것이 같은이라고 생각 :
나는 그것이 같은이라고 생각 :
첫 번째 쿼리는 조인 된 테이블에서 모든 결과를 얻을 다음 WHERE 절에 필터링합니다.
제 쿼리 StatusID 12를 표 1의 결과를 얻고, 그 결과 집합에 가입 행한다.
그것은 미묘한 차이입니다.
편집하다: 여기에 차이를 확인하는 문서에 대한 링크는 다음과 같습니다 http://www.sqlteam.com/article/additional-criteria-in-the-join-clause
from https://stackoverflow.com/questions/3926969/what-is-the-difference-in-these-two-queries-as-getting-two-different-result-set by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 여러 값을 FIND_IN_SET (0) | 2020.07.12 |
---|---|
[SQL] 오라클 DB 인용 열 이름 (0) | 2020.07.12 |
[SQL] 어떻게 T-SQL을 사용하여 URL에서 XML을 읽을 수 있습니까? (0) | 2020.07.12 |
[SQL] 동적 SQL을 사용하면 간단한 SQL 쿼리에 변수를 추가하여 열 이름을 지정합니다 (0) | 2020.07.12 |
[SQL] 어떻게 SQL 작업이 성공적으로 실행 여부를 C #의 여부를 확인하는 (0) | 2020.07.12 |