0

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

这只是返回 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 和只是更直接地比较表列(我认为这是正确的)。但是我想先让上述工作。

4

2 回答 2

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

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

|  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

请注意,当您使用 a 时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

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

于 2012-12-03T18:46:21.303 回答
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)
于 2012-12-03T18:35:54.113 回答