У меня есть следующие таблицы с их сценарием вставки:
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 иеще петли.