6

我有以下表格

项目1

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

项目3

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

项目2

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)?我还想显示 TOTALROWS = 1,因为除了前 3 列之外,其他行包含 NULL。

谢谢你。

4

3 回答 3

5

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

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

也许有一个明显的原因,但如果你想消除第二个表没有匹配的行,为什么要使用左连接?似乎您的第一个连接应该是内部连接,而您的第二个连接应该是左连接 - 在这种情况下,这将为您提供您想要的结果。

于 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 回答