2011-09-16 52 views
0

我有自己的插入脚本如下表:如何使有条件的SQL加入

DECLARE @A TABLE 
    (
     [ID] INT IDENTITY, 
     [SID] INT 
    ) 


DECLARE @EP TABLE 
    (
     [SID] INT , 
     [RID] INT , 
     [HR] INT 
    ) 

DECLARE @XR TABLE 
    (
     [SID] INT , 
     [RID] INT , 
     [UID] INT 
    ) 

DECLARE @SR TABLE 
    (
     [RID] INT , 
     [RNAME] VARCHAR(10), 
     [SID] INT 
    ) 


INSERT INTO @A 
SELECT 1 UNION 
SELECT 2 


INSERT INTO @EP 
SELECT 1, 1, 1 UNION 
SELECT 1, 2, 1 UNION 
SELECT 1, 3, 1 UNION 
SELECT 2, 4, 1 UNION 
SELECT 2, 5, 1 UNION 
SELECT 2, 6, 1 

INSERT INTO @XR 
SELECT 1, 1, 1 UNION 
SELECT 1, 2, 1 UNION 
SELECT 1, 2, 2 UNION 
SELECT 2, 4, 1 UNION 
SELECT 2, 5, 2 

INSERT INTO @SR 
SELECT 1,'Apple', 1 UNION 
SELECT 2,'Mango', 1 UNION 
SELECT 3,'Banana',1 UNION 
SELECT 4,'Apple', 2 UNION 
SELECT 5,'Mango', 2 UNION 
SELECT 6,'Banana',2 

当我运行下面的SQL查询,我得到两个输出行这是很好的:

DECLARE @UD INT 
SET @UD=1 

SELECT * FROM @A A 
WHERE EXISTS(
    SELECT 1      
    FROM @EP [EP]      
    INNER JOIN @XR XR ON [EP].SID = A.SID 
    WHERE [EP].SID = A.SID      
    AND [EP].RID = XR.RID 
    AND [EP].[HR] = 1      
    AND XR.UID = @UD 
) 
--OUTPUT 
--ID   SID 
------------- ----------- 
--1   1 
--2   2 

但是当我用“@ UD = 3”运行上面的查询时,我没有记录。我想提出一个条件在这里加入的应该是这样的:

SELECT * FROM @A A 
--IF((SELECT COUNT(*) FROM @XR XR WHERE XR.XR=A.SID)>0) 
WHERE EXISTS(
    SELECT 1      
    FROM @EP [EP]      
    INNER JOIN @XR XR ON [EP].SID = A.SID 
    WHERE [EP].SID = A.SID      
    AND [EP].RID = XR.RID 
    AND [EP].[HR] = 1      
    AND XR.UID = @UD 
) 
--ELSE 
WHERE EXISTS(
    SELECT 1      
    FROM @EP [EP]      
    INNER JOIN @SR SR ON SR.SID = A.SID 
    WHERE [EP].SID = A.SID      
    AND [EP].RID = SR.RID 
    AND [EP].[HR] = 1      
    AND SR.[RNAME] = 'Banana' 
) 

的abover查询应返回两行两@UID 1和3,即如果没有找到记录@XR它应该特别UID去其他循环。你能帮我解决这个问题吗?我不想去工会这里,并希望在同样做SINGLE查询条件只加入而不写入外部if和其他循环。

+0

[Rü寻找一个外部联接? –

回答

1
SELECT * FROM @A A 
WHERE ((SELECT COUNT(*) FROM @XR XR WHERE XR.XR=A.SID)=0 AND EXISTS(
    SELECT 1      
    FROM @EP [EP]      
    INNER JOIN @XR XR ON [EP].SID = A.SID 
    WHERE [EP].SID = A.SID      
    AND [EP].RID = XR.RID 
    AND [EP].[HR] = 1      
    AND XR.UID = @UD 
)) OR ((SELECT COUNT(*) FROM @XR XR WHERE XR.XR=A.SID)!=0 AND EXISTS(
    SELECT 1      
    FROM @EP [EP]      
    INNER JOIN @SR SR ON SR.SID = A.SID 
    WHERE [EP].SID = A.SID      
    AND [EP].RID = SR.RID 
    AND [EP].[HR] = 1      
    AND SR.[RNAME] = 'Banana' 
)) 

即只是用一个简单的布尔结合两者。您可能不需要第二个COUNT(*)查询BTW。

0

这应该这样做,如果我理解正确的要求:

SELECT DISTINCT 
    A.* 
FROM @A AS A 
JOIN @EP AS EP ON A.SID = EP.SID 
LEFT JOIN @XR AS XR ON EP.RID = XR.RID 
LEFT JOIN @SR AS SR ON SR.SID = A.SID 
WHERE EP.HR = 1 
    AND (XR.UID = @UD OR RNAME IS NOT NULL)