2016-07-22 12 views
-1

2つのテーブル(それぞれ約20個の列)があり、列名は一致しませんが、1列の値の一部は別の列の値と一致します。列内の条件に基づいてselect内のテーブルを結合するSQLServer

プライマリテーブルの列のTrue/False値に基づいて特定の列の2つの表の組み合わせを取得したいとします。

OracleのSQL DeveloperでSQLServer Third-Party JDBCドライバを使用しています(私の構文に影響するかどうか、その方法がわからない)。

私はこれが簡単だと確信していますが、これを行う例は見つかりません。私はこれを試してみました

SELECT colA1, colA5, 
IF colA5 = True 
    THEN colB2, colB3, etc. 
    ELSE colA2, ColA3, etc. 
FROM tableB, tableA 
WHERE colA1 = colB1 AND colB4 = 2016 AND colA6 = 2016 

SELECT A.colA1 
,A.colA4 
,A.colA5 
,CASE 
    WHEN A.colA5 = TRUE 
     THEN B.colB2 
    ELSE A.colA2 
    END AS 'combined(colA2 & colB2)' 
,CASE 
    WHEN A.colA5 = TRUE 
     THEN B.colB3 
    ELSE A.colA4 
    END AS 'combined(colA3 & colB3)' 
, 
FROM TableA A 
    ,TableB B 
WHERE A.colA6 = '2016' 
    AND B.colB4 = '2016' 
    AND (
     A.colA4 = B.colB1 
     OR A.colA4 IS NULL 
     ) 

私が取得することはこれです:

+-------+-------+-------+-------------------------+-------------------------+ 
| colA1 | colA4 | colA5 | combined(colA2 & colB2) | combined(colA3 & colB3) | 
+-------+-------+-------+-------------------------+-------------------------+ 
| AC1-3 | AC4-3 | TRUE | BC2-1     | BC3-1     | 
| AC1-4 | AC4-4 | TRUE | BC2-2     | BC3-2     | 
+-------+-------+-------+-------------------------+-------------------------+ 

CREATE TABLE [dbo].[TableA] (
    [colA1] VARCHAR (10) NULL, 
    [colA2] VARCHAR (10) NULL, 
    [colA3] VARCHAR (10) NULL, 
    [colA4] VARCHAR (10) NULL, 
    [colA5] VARCHAR (10) NULL, 
    [colA6] INT   NULL, 
    [colKey] INT   NOT NULL, 
    CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED ([colKey] ASC) 
); 

CREATE TABLE [dbo].[TableB] (
    [colB1] VARCHAR (10) NULL, 
    [colB2] VARCHAR (10) NULL, 
    [colB3] VARCHAR (10) NULL, 
    [colB4] INT   NULL, 
    [colKey] INT   NOT NULL, 
    PRIMARY KEY CLUSTERED ([colKey] ASC) 
); 

INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (1,'AC1-1','AC2-1','AC3-1',NULL,'FALSE',2016); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (2,'AC1-2','AC2-2','AC3-2',NULL,'FALSE',2016); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (3,'AC1-3',NULL,NULL,'AC4-3','TRUE',2016); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (4,'AC1-4',NULL,NULL,'AC4-4','TRUE',2016); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (5,'AC1-5','AC2-5','AC3-5',NULL,'FALSE',2015); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (6,'AC1-6','AC2-6','AC3-6',NULL,'FALSE',2015); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (7,'AC1-7',NULL,NULL,'AC4-7','TRUE',2015); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (8,'AC1-8',NULL,NULL,'AC4-8','TRUE',2015); 
INSERT INTO TableA(colKey,colA1,colA2,colA3,colA4,colA5,colA6) VALUES (9,'AC1-9',NULL,NULL,'AC4-9','TRUE',2016); 

INSERT INTO TableB(colKey,colB1,colB2,colB3,colB4) VALUES (1,'AC4-3','BC2-1','BC3-1',2015); 
INSERT INTO TableB(colKey,colB1,colB2,colB3,colB4) VALUES (2,'AC4-4','BC2-2','BC3-2',2015); 
INSERT INTO TableB(colKey,colB1,colB2,colB3,colB4) VALUES (3,'AC4-4','BC2-3','BC3-3',2016); 
INSERT INTO TableB(colKey,colB1,colB2,colB3,colB4) VALUES (4,'AC4-3','BC2-4','BC3-4',2016); 
INSERT INTO TableB(colKey,colB1,colB2,colB3,colB4) VALUES (5,'AC4-7','BC2-5','BC3-5',2015); 
INSERT INTO TableB(colKey,colB1,colB2,colB3,colB4) VALUES (6,'AC4-8','BC2-6','BC3-6',2015); 

TableA    
+-------+--------+--------+--------+-------+-------+ 
| colA1 | colA2 | colA3 | colA4 | colA5 | colA6 | 
+-------+--------+--------+--------+-------+-------+ 
| AC1-1 | AC2-1 | AC3-1 | (Null) | FALSE | 2016 | 
| AC1-2 | AC2-2 | AC3-2 | (Null) | FALSE | 2016 | 
| AC1-3 | (Null) | (Null) | AC4-3 | TRUE | 2016 | 
| AC1-4 | (Null) | (Null) | AC4-4 | TRUE | 2016 | 
| AC1-5 | AC2-5 | AC3-5 | (Null) | FALSE | 2015 | 
| AC1-6 | AC2-6 | AC3-6 | (Null) | FALSE | 2015 | 
| AC1-7 | (Null) | (Null) | AC4-7 | TRUE | 2015 | 
| AC1-8 | (Null) | (Null) | AC4-8 | TRUE | 2015 | 
| AC1-9 | (Null) | (Null) | AC4-9 | TRUE | 2016 | 
+-------+--------+--------+--------+-------+-------+ 

TableB  
+-------+-------+-------+-------+ 
| colB1 | colB2 | colB3 | colB4 | 
+-------+-------+-------+-------+ 
| AC4-3 | BC2-1 | BC3-1 | 2015 | 
| AC4-4 | BC2-2 | BC3-2 | 2015 | 
| AC4-4 | BC2-3 | BC3-3 | 2016 | 
| AC4-3 | BC2-4 | BC3-4 | 2016 | 
+-------+-------+-------+-------+ 

Results Table   
+-------+--------+-------+-------------------------+-------------------------+ 
| colA1 | colA4 | colA5 | combined(colA2 & colB2) | combined(colA3 & colB3) | 
+-------+--------+-------+-------------------------+-------------------------+ 
| AC1-1 | (null) | FALSE | AC2-1     | AC3-1     | 
| AC1-2 | (null) | FALSE | AC2-2     | AC3-2     | 
| AC1-3 | AC4-3 | TRUE | BC2-1     | BC3-1     | 
| AC1-4 | AC4-4 | TRUE | BC2-2     | BC3-2     | 
| AC1-9 | AC4-9 | TRUE | (null)     | (null)     | 
+-------+--------+-------+-------------------------+-------------------------+ 

だから、私はこのようなSELECTのいくつかの種類が必要だと思います

私はTableA/colA5がFALSEである行が見当たりません。また、私はこれらの「結合された」列のうち12個が必要ですが、12個のCASE文を使用しないようにする方法はありますか?

+2

実際に使用しているDBMSはどれですか。あなたはsql-serverとplsql(これはOracle)でタグ付けされています。彼らは同じことではありません。 –

+0

遅れて申し訳ありません、私は仕事中にこのアカウントをチェックしています。あなたは当然のことですが、残念です。 SQL-Serverデータベースのデータにアクセスしようとしています(ただし、Oracle SQL Developerの「Third Party JDBC Driver」機能を使用しています)。 – user1871014

+0

私はあなたが何をしようとしているのか分かりませんが、おそらく列でISNULLを使用するのと同じくらい簡単ですか? ISNULL(colA2、colB2)をCombinedとして選択します。そうでない場合は、詳細を入力する必要があります。これは始めるのに適しています。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

0

ジョインとケースについて知った後、答えがあります(明らかに、私が避けたければ12 CASEステートメントを使用する必要があります)。

SELECT A.colA1 
,A.colA4 
,A.colA5 
,CASE 
    WHEN A.colA5 = 'TRUE' 
     THEN B.colB2 
     ELSE A.colA2 
    END AS 'combined(colA2 & colB2)' 
,CASE 
    WHEN A.colA5 = 'TRUE' 
     THEN B.colB3 
     ELSE A.colA3 
    END AS 'combined(colA3 & colB3)' 
FROM TableA A LEFT JOIN TableB B ON A.colA4 = B.colB1 
WHERE (A.colA6 = '2016' and A.colA5 ='FALSE') 
    or (A.colA6 = '2016' and A.colA5 ='true' and B.colB4 = '2016') 
    or (A.colA6 = '2016' and A.colA5 ='true' and B.colB4 is null) 
    ; 
関連する問題