从sql server中的多个LEFT JOIN中删除NULL值

Sna*_*yes 5 sql sql-server-2005

我有以下表格

项目1

ID | NAME | GEARS | ITEM2_ID  |
-------------------------------
1  | Test | 56    | 4         |
2  | Test2| 12    | 2         |
Run Code Online (Sandbox Code Playgroud)

项目3

ID | NAME | DATA  | ITEM2_ID  |
-------------------------------
1  | Test | 1     | 1         |
2  | Test7| 22    | 3         |
Run Code Online (Sandbox Code Playgroud)

项目2

ID |   VALUE       |
--------------------
1  |   is simple   |  
2  |   is hard     | 
3  |   is different|
4  |   is good     |
5  |   very good   |
Run Code Online (Sandbox Code Playgroud)

我的查询

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
Run Code Online (Sandbox Code Playgroud)

和结果

在此处输入图片说明

如何使用上述 SQL 查询删除(如果可能)第一行(ID = 5)?另外我想显示 TOTALROWS = 1 因为其他行包含除前 3 列之外的 NULL。

谢谢你。

ype*_*eᵀᴹ 5

如果我理解正确,您只想保留第一个或第二个(或两者)外连接成功的行:

WHERE ITEM1table.ITEM2_ID IS NOT NULL 
   OR ITEM3table.ITEM2_ID IS NOT NULL 
Run Code Online (Sandbox Code Playgroud)

可以对查询进行一些简化。不需要嵌套子查询:

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.
Run Code Online (Sandbox Code Playgroud)