将UNION添加到两个SELECT语句中(使用CASE)

时间:2012-12-03 18:27:55

标签: sql union

好的,这是我的实际表格和数据:

这只是返回Y或N而不是直接比较数据

tblViewLearners(此intID =另一个表中的intLearnerID)

IntID   -   FirstName    -  Surname   -  Course    - Dob    - address     - nationality
701271      Julie           Barnett      Physics     NULL       NULL          NULL
345239      Rachel          Smith        Physics     NULL       NULL          NULL
240259      David           Feffer       Maths       NULL       NULL          NULL

tblAWARDSLearner(基本上如果学习者在这张桌子上有一个' DISTINCTION')

 intID   -  intLearnerID    -  dateawarded
 2402       701271             21/04/1992
 1032       345239             01/01/2010

我的目标

IntID   -   FirstName    -  Surname   -  Course     - DISTINCTION Awarded
701271      Julie           Barnett      Physics          Yes
345239      Rachel          Smith        Physics          Yes
240259      David           Feffer       Maths            No

代码

SELECT Y.intID
FROM
(
SELECT    A.* ,   
CASE 
        WHEN B.intLearnerID IS NULL THEN 'N' 
        ELSE 'Y' 
END 'DISTINCTION Awarded' x
FROM 
    tblviewlearners A
    LEFT JOIN tblAWARDSLearner B
    ON A.intID = B.intLearnerID

)AS Y;

我还要和另一张桌子一起加入,但是一旦上面的工作就会越过那座桥梁,值得注意的是上面的表格已经进一步宣布,所以当我加入时我不需要包括它在FROM中,只是直接比较表列(我认为这是正确的)。但是我希望首先完成上述工作。

2 个答案:

答案 0 :(得分:1)

编辑#2,根据您的更新,使用您的示例数据,您应该能够使用以下内容:

SELECT  A.Intid, A.Firstname, A.Surname, A.Course,   
  CASE 
        WHEN B.intLearnerID IS NULL THEN 'No' 
        ELSE 'Yes' 
  END DISTINCTIONAwarded 
FROM tblviewlearners A
LEFT JOIN tblAWARDSLearner B
  ON A.intID = B.intLearnerID

请参阅SQL Fiddle with Demo

这为您提供了所需的结果:

|  INTID | FIRSTNAME | SURNAME |  COURSE | DISTINCTIONAWARDED |
---------------------------------------------------------------
| 701271 |     Julie | Barnett | Physics |                Yes |
| 345239 |    Rachel |   Smith | Physics |                Yes |
| 240259 |     David |  Feffer |   Maths |                 No |

您当前的查询存在多个问题。首先,在最终)之后,您在末尾有一个额外的右括号JOIN - 将其删除。其次,你给BestSeller一个字符串列名,你不能使用字符串文字 - 删除单引号。最后在您的第二个查询中,您使用的是SELECT A.*,但A别名来自您需要使用别名Y的内部查询:

SELECT * 
FROM tblbookshop 
INNER JOIN tblAllsellers
    ON tblbookshop.productID = tblAllsellers.BookID
UNION
SELECT Y.*  
FROM AnotherTable X 
JOIN 
 (
    SELECT  A.*, 
        CASE 
            WHEN B.ProductId IS NULL THEN 'N' 
            ELSE 'Y' 
        END BestSeller
    FROM tblAllSellers A
    LEFT JOIN tblBestSellers B
        ON A.ProductId = B.ProductID
 ) AS Y
    ON X.ProductId = Y.ProductID

注意,当您使用UNIONUNION ALL时,两个查询中的列数必须相同,并且数据类型需要与两个列中的列相同查询。

根据您对UNION收到错误的评论进行修改,我有一些建议。如果您有不同的列数,我看不到您的完整表结构,那么您可以在查询中包含具有较少列数的占位符列。以下是这些示例表具有不同列数的示例:

CREATE TABLE Table1([col1] int, [col2] varchar(4));

INSERT INTO Table1 ([col1], [col2])
VALUES (1, 'test'),(2, 'blah');

CREATE TABLE Table2 ([col1] int, [col2] varchar(5), [col3] varchar(5));

INSERT INTO Table2 ([col1], [col2], [col3])
VALUES  (1, 'test1', 'data1'),  (2, 'test2', 'data2');

如果我尝试UNION操作,那么它将生成错误消息,但如果我包含占位符列,那么它将起作用:

select col1, col2, null as col3
from table1
union all
select col1, col2, col3
from table2;

请参阅SQL Fiddle with Demo

我的另一个建议是不在表上使用SELECT *,然后你可以指定要返回的列,这可以纠正你收到的错误。

答案 1 :(得分:0)

你需要删除最后一个“)”。

我建议您在()内附上BOTH Select,以便获得

(SELECT * 
FROM tblbookshop INNERJOIN tblAllsellers
ON tblbookshop.productID = tblAllsellers.BookID)

UNION
( SELECT A.*  
 FROM 
 AnotherTable X 
 JOIN 
 (
    SELECT 
        A.*, 
        CASE 
            WHEN B.ProductId IS NULL THEN 'N' 
            ELSE 'Y' 
        END 'BestSeller'
    FROM 
        tblAllSellers A
        LEFT JOIN tblBestSellers B
        ON A.ProductId = B.ProductID
 ) AS Y
 ON X.ProductId = Y.ProductID)