2012-05-14 124 views
3

我有以下表删除从多个LEFT NULL值在SQL Server JOIN

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 

,结果

enter image description here

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

谢谢。

回答

3

如果我理解正确的话,你希望只保留行,其中第一或在第二个(或两个)外连接成功:

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. 
3

也许有一个明显的原因,但是如果你想消除第二个表没有匹配的行,你为什么要使用左连接?看起来你的第一次加入应该是一个内部加入,你应该留下第二次加入 - 这会给你在这种情况下你想要的结果。

+0

我的例子很简单,是一个场景,我不知道的话只属于一个表或多个表...我的数据库具有表超过10000字' ITEM2',它可能出现在ITEM1或ITEM3中 –

+1

@Michael Swan:简单与否,你问的是如何从结果中排除第1行,因为列的“中间集合”是NULL,并且INNER JOIN是你怎么做的它。如果您的情况更加复杂,请提供一些其他详细信息,以便我们帮助您找到解决方案 - 目前,切换联接类型可以解决您所说的问题。 – SqlRyan

0

您可以使用INNER JOIN代替LEFT JOIN,或把

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

在查询结束