Как сделать условное соединение SQL - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть следующие таблицы с их сценарием вставки:

    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это должно пойти на еще цикл.Можете ли вы помочь мне решить эту проблему?Я не хотел бы идти по поводу union здесь и хотел бы сделать то же самое в SINGLE запросе с условиями в , объединяет только и не записывает внешний if иеще петли.

Ответы [ 2 ]

1 голос
/ 17 сентября 2011
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 (*).

0 голосов
/ 17 сентября 2011

Это следует сделать, если я правильно понимаю требование:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...