2012-12-03 40 views
0

確定是我的實際表和數據:添加UNION兩個SELECT語句(使用CASE)這裏

這只是返回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中,只是比較表格列更直接(我認爲這是正確的)。不過,我想先得到上述工作。

+1

括號內沒有匹配?另外,「BestSeller」是一個字符串,不是標識符。不知道你的關係型數據庫我不能告訴你如何解決這個問題;) – 2012-12-03 18:31:31

+0

什麼是在'結束'之後做的'BestSeller'? – Horen

回答

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的錯誤,我有幾點建議。雖然如果您的列數不同,但無法看到完整的表結構,那麼您可能可以在查詢中包含列數較少的佔位符列。下面是這些樣品表含有S不同的列數的一個示例:

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 *,那麼你可以指定要返回哪些列,這可以糾正錯誤,你一個重新接收。

+0

hmmm我收到以下錯誤:消息205,級別16,狀態1,行1 所有使用UNION,INTERSECT或EXCEPT運算符組合的查詢必須在其目標列表中具有相同數量的表達式。 我發現這兩個表都有一個匹配的列,但列的數量不完全相同,所以我使用了INTERSECT,但仍然收到以下錯誤消息? – starydynamo

+0

@starydynamo列**的數量**必須相同才能進行「UNION」操作。如果您沒有相同數量的列,則可以使用佔位符列。例如,如果您的第一個查詢具有一個較少的列,那麼將另一列放在第二個查詢上的空值。 – Taryn

+0

@starydynamo看到我的編輯,並提供了一些關於如何解決錯誤的建議。如果你想要的話,然後用你的表和一些數據創建一個sql小提琴,我可以更好地看看。 – Taryn

0

您需要刪除最後一個「)」。

我建議你附上BOTH內()選擇讓你得到

(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)