6

次のテーブルがあります

ITEM1

ID | NAME | GEARS | ITEM2_ID  |
-------------------------------
1  | Test | 56    | 4         |
2  | Test2| 12    | 2         |

ITEM3

ID | NAME | DATA  | ITEM2_ID  |
-------------------------------
1  | Test | 1     | 1         |
2  | Test7| 22    | 3         |

ITEM2

ID |   VALUE       |
--------------------
1  |   is simple   |  
2  |   is hard     | 
3  |   is different|
4  |   is good     |
5  |   very good   |

そして私の質問

SELECT TOP(3) * FROM (
    SELECT ID, 
       rankTable.RANK as RANK_,
        TOTALROWS = COUNT(*) OVER() 
 FROM ITEM2
 INNER JOIN 
     CONTAINSTABLE(ITEM2, [VALUE], 'ISABOUT("good")') as rankTable
 ON ITEM2.ID = rankTable.[KEY]
) as ITEM2table

LEFT JOIN (
    SELECT ID, 
      NAME, 
      GEARS, 
      ITEM2_ID 
    FROM ITEM1
) as ITEM1table
ON ITEM1table.ITEM2_ID = ITEM2table.ID

LEFT JOIN (
    SELECT ID, 
        NAME, 
        DATA, 
        ITEM2_ID 
    FROM ITEM3
) as ITEM3table
ON ITEM3table.ITEM2_ID = ITEM2table.ID

そして結果

ここに画像の説明を入力

上記の SQL クエリを使用して最初の行 (ID = 5) を削除する方法 (可能な場合) は? また、他の行には最初の 3 列を除いて NULL が含まれているため、TOTALROWS = 1 を表示したいと考えています。

ありがとうございました。

4

3 に答える 3

5

私の理解が正しければ、最初または 2 番目 (または両方) の外部結合が成功した行のみを保持する必要があります。

WHERE ITEM1table.ITEM2_ID IS NOT NULL 
   OR ITEM3table.ITEM2_ID IS NOT NULL 

クエリでいくつかの単純化を行うことができます。ネストされたサブクエリは必要ありません:

SELECT TOP(3) 
    ITEM2table.ID, 
    rankTable.RANK as RANK_,
    TOTALROWS = COUNT(*) OVER(),
    ITEM1table.*,
    ITEM3table.*  

FROM 
        ITEM2 

    INNER JOIN 
        CONTAINSTABLE(ITEM2, [VALUE], 'ISABOUT("good")') as rankTable
    ON ITEM2.ID = rankTable.[KEY]

    LEFT JOIN 
        ITEM1  as ITEM1table
    ON ITEM1table.ITEM2_ID = ITEM2.ID

    LEFT JOIN 
        ITEM3  as ITEM3table
    ON ITEM3table.ITEM2_ID = ITEM2.ID

WHERE ITEM1table.ITEM2_ID IS NOT NULL 
   OR ITEM3table.ITEM2_ID IS NOT NULL 

ORDER BY  something                     --- you need to order by something
                                        --- if you use TOP. Unless you want 
                                        --- 3 (random) rows.
于 2012-05-14T06:53:04.897 に答える
4

Maybe there's an obvious reason, but if you want to eliminate rows where the second table doesn't have a match, why are you using a left join? It seems like your first join should be an inner join and your second should be left - that would give you the results you want in this case.

于 2012-05-14T06:21:19.137 に答える
3

INNER JOINの代わりに使用するかLEFT JOIN、置くことができます

WHERE ITEM1table.ID IS NOT NULL AND ITEM3table.ID IS NOT NULL

クエリの最後に

于 2012-05-14T06:24:14.750 に答える