2017-10-18 5 views
0

NULL의 표 2의 결과에 참여 왼쪽 다음 표 2 플래그

INSERT INTO Table1 
VALUES ('Record 1'), ('Record 2'), ('Record 3') 

INSERT INTO Table2 
VALUES ('test 1',1,1), ('test 2',1,0), ('test 3',1,1), 
     ('test 1',2,0), ('test 2',2,1), ('test 3',2,2) 

같은 값이 2 테이블

CREATE TABLE Table1 (
    Table1_Key INT IDENTITY(1,1), 
    Info NVARCHAR(50), 
    PRIMARY KEY (Table1_Key) 
); 


CREATE TABLE Table2 (
    Table2_Key INT IDENTITY(1,1), 
    Info_table2 NVARCHAR(50), 
    Table1_FKey INT, 
    Flag BIT NOT NULL, 
    PRIMARY KEY (Table2_Key,Table1_FKey), 
    FOREIGN KEY (Table1_FKey) REFERENCES Table1(Table1_Key) 
); 

을 갖는 결과에 어떻게 LEFT JOINTable2과 함께 할 수 있다는 것을 모두 Table1을 선택하고 Table2ANDTable2 값의 Flag에 1을 입력하십시오.

예상 결과 :

Table1_Key Info Table2_Key Info_table2 Table1_FKey Flag 
------------------------------------------------------------------ 
    1   Record 1  NULL  NULL  NULL  NULL 
    2   Record 2  NULL  NULL  NULL  NULL 
    3   Record 3  NULL  NULL  NULL  NULL 
    1   Record 1  1   test 1  1  1 
    1   Record 1  3   test 3  1  1 
    2   Record 2  5   test 2  2  1 
    2   Record 2  6   test 3  2  1 

는 내가하는 할 노력하고있어 참여가 작동하지 않습니다 :

SELECT * FROM Table1 
LEFT JOIN Table2 
ON Table1_FKey = Table1_Key 
WHERE Flag = 1 
+1

'WHERE'을'AND '로 변경하면'왼쪽 결합 '동작이 적용됩니다. – HoneyBadger

+0

또는 내부 조인을 사용합니다. –

+0

운영 명령 문제입니다. 조인은 널 (null) 레코드 작성을 _}시킵니다. 그런 다음 flag = 1을 말하면서 제외시킵니다. 제한을 유지하려면 조인을 제한으로 이동하여 조인의 일부로 제한이 적용되고 Null 레코드가 유지됩니다. 'LEFT JOIN table2 on Table1_FKEY = Table1_key AND flag = 1' – xQbert

답변

1

DEMO:

케이스 문을 수행해야합니다. table2의 각 열은이를 수행해야합니다.

SELECT table1_key 
    , info 
    , case when flag =0 then null else table2_key end as table2_key 
    , case when flag =0 then null else info_table2 end as info_table2 
    , case when flag =0 then null else table1_fkey end as table1_fkey 
    , case when flag =0 then null else flag end as flag 
FROM Table1 
LEFT JOIN Table2 
    ON Table1_FKey = Table1_Key 
ORDER BY table2_key 

우리에게주기 :

+------------+----------+------------+-------------+-------------+--------+ 
| table1_key | info | table2_key | info_table2 | table1_fkey | flag | 
+------------+----------+------------+-------------+-------------+--------+ 
|   1 | Record 1 | (null)  | (null)  | (null)  | (null) | 
|   2 | Record 2 | (null)  | (null)  | (null)  | (null) | 
|   3 | Record 3 | (null)  | (null)  | (null)  | (null) | 
|   1 | Record 1 | 1   | test 1  | 1   | true | 
|   1 | Record 1 | 3   | test 3  | 1   | true | 
|   2 | Record 2 | 5   | test 2  | 2   | true | 
|   2 | Record 2 | 6   | test 3  | 2   | true | 
+------------+----------+------------+-------------+-------------+--------+ 
+1

그런 다음 필터 및 사용 사례 문이 없으므로 레코드가 실제로 제거되지 않습니다. 깃발이 제로가 아니면 그냥 밖으로 nulled. and w/o union – xQbert

+0

@xQbert 이제 나에게 도움이 될 것이다. 감사합니다. '노조'가 없으면 해결하기가 어려웠습니다. – Ragmar

2

을 그래서 기본적으로이? : 국기에

SELECT * FROM Table1 
INNER JOIN Table2 
ON Table1_FKey = Table1_Key 
WHERE Flag = 1 
UNION ALL 
SELECT t1.*,NULL,NULL,NULL,NULL FROM Table1 t1 
+0

이것은 나에게 예상되는 결과,하지만 UNION 없이는 할 수있는 방법을 찾고 있었다. – Ragmar

+2

글쎄, 그건 문제 야. 레코드는 일치하는 것을 찾거나 찾을 수 없다. 그것은 둘 다 할 수 없다 (table1의 각 레코드에 대해, 'NULL'이있는 행과/s와 일치하는 행/s). 내가 아는 한 불가능합니다. @Ragmar – sagi

1

확인이 쿼리 :

    표에서
  1. 선정 값 1
  2. 연합 (EU)의 모든
  3. 조건에 따라 값을 가져 오기 및

    가입 왼쪽으로 ,
    SELECT  Table1_Key, Info, NULL AS Expr3, NULL AS Expr4, NULL AS Expr5, NULL AS Expr6 
    FROM   Table1 
    
    UNION ALL 
    
    SELECT  Table1_1.Table1_Key, Table1_1.Info, Table2.Table2_Key, Table2.Info_table2, Table2.Table1_FKey, Table2.Flag 
    FROM   Table2 LEFT JOIN 
           Table1 AS Table1_1 ON Table2.Table1_FKey = Table1_1.Table1_Key 
    WHERE  (Table2.Flag = 1) 
    

출력 :

enter image description here

+0

이것은 기본적으로 @sagi와 동일하지만, 제가 말씀 드렸듯이'UNION'이 없으면 좋았을 것입니다. – Ragmar

2

예상되는 결과 SAGI 의해 기술로 식은되는 UNION없이 가능하지 않다. Table1_Key = Table1_FkeyLEFT JOIN 조건을 지정하여

, 당신은 조건 일치하지 않는 경우 조건 경기 (기록 1 기록 2)를 수행 표에서 행과 행을 포함하도록 설정 결과를 (정의하고 기록 3).

이렇게 생각하면 ...당신은 테이블 간 조인 경우 (표 2의 모든 레코드와 테이블 1의 모든 레코드와 일치),이와 끝까지 :

Table1_Key Info Table2_Key Info_table2 Table1_FKey Flag 
------------------------------------------------------------------ 
1   Record 1  1   test 1  1   1 
1   Record 1  2   test 2  1   0 
1   Record 1  3   test 3  1   1 
1   Record 1  4   test 1  2   0 
1   Record 1  5   test 2  2   1 
1   Record 1  6   test 3  2   1   
2   Record 2  1   test 1  1   1 
2   Record 2  2   test 2  1   0 
2   Record 2  3   test 3  1   1 
2   Record 2  4   test 1  2   0 
2   Record 2  5   test 2  2   1 
2   Record 2  6   test 3  2   1   
3   Record 3  1   test 1  1   1 
3   Record 3  2   test 2  1   0 
3   Record 3  3   test 3  1   1 
3   Record 3  4   test 1  2   0 
3   Record 3  5   test 2  2   1 
3   Record 3  6   test 3  2   1   

그러나 Table1_Key = Table1_Fkey AND Flag = 1로 조인 조건을 지정하여, 당신은 결과 집합을 제한하고

Table1_Key Info Table2_Key Info_table2 Table1_FKey Flag 
------------------------------------------------------------------ 
1   Record 1  1   test 1  1   1 
1   Record 1  3   test 3  1   1 
2   Record 2  5   test 2  2   1 
2   Record 2  6   test 3  2   1   

을 그리고 그것은 LEFT JOIN, 표 2에 일치하는 항목을 찾지 못했습니다 표에서 모든 레코드를 때문에 포함됩니다 :

Table1_Key Info Table2_Key Info_table2 Table1_FKey Flag 
------------------------------------------------------------------ 
1   Record 1  1   test 1  1   1 
1   Record 1  3   test 3  1   1 
2   Record 2  5   test 2  2   1 
2   Record 2  6   test 3  2   1   
3   Record 3  NULL  NULL  NULL  NULL  
그 조건이 true 해당 행에

SELECT * 
FROM Table1 
LEFT JOIN Table2 
ON Table1_FKey = Table1_Key AND Flag = 1 
UNION ALL 
SELECT t1.*,NULL,NULL,NULL,NULL FROM Table1 t1 
WHERE t1.Table1_Key in (1,2) 

... 원하는 결과를 얻을 수 :

Table1_Key Info Table2_Key Info_table2 Table1_FKey Flag 
------------------------------------------------------------------ 
1   Record 1  1   test 1  1   1 
1   Record 1  3   test 3  1   1 
2   Record 2  5   test 2  2   1 
2   Record 2  6   test 3  2   1   
3   Record 3  NULL  NULL  NULL  NULL  
1   Record 1  NULL  NULL  NULL  NULL  
2   Record 2  NULL  NULL  NULL  NULL  
을 53,691,363,210

그래서, 당신이 찾고있는 결과 집합을 얻기 위해, 당신은 표 1에서 여분의 행에 명시 적으로 UNION를 필요

+1

insn't table2_key가 잘못된 예상 결과입니까? 모두 1이야? 세트가 {NULL, NULL, NULL, 1,3,5,6} 일 때 – xQbert

+0

@TruAvatar 귀하의 답변은 정말 좋았지 만 @xQbert는 이제 '연합'이없는 해결책을 게시했습니다. 좀 더 많은 SQL을 이해하도록 도와줍니다. 고맙습니다. – Ragmar

+1

'CASE' 메서드는이 인스턴스에서 결과를 뱉어 내지 만 실제 데이터로 작업 할 때는주의해야합니다. Table1_Fkey = 1 및 Flag = 0 인 Table2에 두 개의 행이있는 경우 {1, Record 1, NULL, NULL, NULL, NULL}의 중복 행을 가져옵니다. 이것은 당신이하고있는 일에 대해서는 문제가되지 않을 수도 있지만 인식하고 있어야합니다. – TruAvatar