0

我不是sql Guru,这就是我问你们的原因。

我有这个存储过程:

USE [groep2_festivals]
GO
/****** Object:  StoredProcedure [dbo].[GetGroupsNotOfFestival]    Script Date: 15-05-13 10:03:17 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Robbie Vercammen
-- Create date: 2013-05-15
-- Description: Getting all groups not on a defined festival
-- =============================================
ALTER PROCEDURE [dbo].[GetGroupsNotOfFestival]
    @festId  nvarchar(4)
AS
BEGIN
    SELECT DISTINCT b.*, p.* 
    FROM bands b 
    JOIN bandsperfestival bpf ON b.band_id = bpf.band_id 
    JOIN podia p ON p.pod_id = bpf.pod_id
    WHERE bpf.fest_id != @festId
END

还有这些表,乐队:

乐队表

Podia(英语阶段):

阶段表

BandsPerFestival 举办所有在音乐节上演出的乐队:

所有乐队在音乐节上表演的桌子

我使用这个存储过程让所有乐队在特定节日(按节日 ID)上表演,这很有效,但我想反转这个但简单的替换WHERE bpf.fest_id = @festId似乎WHERE bpf.fest_id != @festId不起作用。我得到了相同的列表,但实际上在音乐节上表演的乐队被退回了两次。

例子:

出了什么问题的例子

如您所见,当他们实际在所选音乐节上表演时,镍背出现在列表中两次。

任何帮助表示赞赏。

编辑:我应该早点说,但我想要所有不在特定音乐节上表演的乐队,

4

2 回答 2

2

执行左外连接,然后强制连接的右侧为空。

SELECT DISTINCT b.*
FROM bands b 
left outer JOIN bandsperfestival bpf ON b.band_id = bpf.band_id 
and @festId = bpf.fest_id
where bpf.fest_id is null
于 2013-05-20T18:08:07.807 回答
0

当你说“反转”这个时,你需要解释你的意思。你的意思是你想要所有没有参加任何音乐节的乐队吗?或者所有没有演奏特定音乐节的乐队?

于 2013-05-20T17:57:37.567 回答