2016-07-22 97 views
-1

我有兩個表(每列大約有20列),沒有列名匹配,但1列中的某些值與另一列中的值匹配(請參見下文) 。根據列中的條件組合select中的條件SQLServer

我想基於主表上的列中的True/False值在某些列上獲得2個表的組合。

我正在使用Oracle的SQL Developer中的SQLServer第三方JDBC驅動程序(我不確定是否或如何對我的語法產生影響)做所有這些工作。

我相信這很簡單,但我找不到任何這樣做的例子,我只是太新來SQL來包裹我的頭了。

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

所以我錯過了TableA/colA5的行是FALSE。另外,我需要12個這樣的「組合」列,是否有一種方法可以避免使用12個CASE語句?

+2

您實際使用哪種DBMS。你用sql-server和plsql(這是Oracle)進行了標記。它們不是同一件事。 –

+0

抱歉,延遲,我只在工作時檢查這個帳戶。你當然是對的,對此很抱歉。 我試圖訪問SQL-Server數據庫上的數據(但我使用Oracle SQL Developer的「第三方JDBC驅動程序」功能)。 – user1871014

+0

我不知道你在做什麼,但也許它就像在列上使用ISNULL一樣簡單? ISNULL(colA2,colB2)合併如果不是這樣,您需要提供更多詳細信息。這將是一個開始的好地方。 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) 
    ;