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 FiddlewithDemoを参照してください

これにより、必要な結果が得られます。

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

現在のクエリにいくつかの問題があります。)まず、最後の最後に余分な閉じ括弧がありますJOIN-それを削除します。次に、BestSeller文字列列名を指定します。文字列リテラルは使用できません。一重引用符を削除してください。最後に、使用している2番目のクエリで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;

SQL FiddlewithDemoを参照してください

私の他の提案は、テーブルでを使用しないことSELECT *です。次に、返す列を指定できます。これにより、受信しているエラーを修正できます。

于 2012-12-03T18:46:21.303 に答える
0

最後の「)」を削除する必要があります。

両方の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 に答える