好的,这是我的实际表格和数据:
这只是返回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中,只是直接比较表列(我认为这是正确的)。但是我希望首先完成上述工作。
答案 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
这为您提供了所需的结果:
| 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
注意,当您使用UNION
或UNION 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;
我的另一个建议是不在表上使用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)