2011-11-17 11 views
22

Soggetto tavoloSELECT non righe di un'altra tabella, query SQL Server

CREATE TABLE [dbo].[BS_Subject](
    [SubjectID] [bigint] IDENTITY(1,1) NOT NULL, 
    [DepartmentID] [bigint] NOT NULL, 
    [SubjectName] [varchar](50) NOT NULL, 
    [SubjectDescription] [varchar](100) NULL, 
    [SubjectShortCode] [varchar](10) NOT NULL, 
CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED 
(
    [SubjectID] ASC 
) 

tavolo SubjectToClass

CREATE TABLE [dbo].[BS_SubjectToClass](
[SubjectToClassID] [bigint] IDENTITY(1,1) NOT NULL, 
[SubjectID] [bigint] NOT NULL, 
[ClassID] [bigint] NOT NULL, 
CONSTRAINT [PK_BS_SubjectToClass] PRIMARY KEY CLUSTERED 
(
[SubjectToClassID] ASC 
) 

ho bisogno di elencare tutte le righe della tabella Subject dove subjectid non è in SubjectToClass tavola di un classe specificata.

Ho questo ma incapace di andare oltre

select Distinct(BS_Subject.SubjectID) DepartmentID, 
     SubjectName, SubjectDescription, SubjectShortCode 
from dbo.BS_Subject 
where BS_Subject.SubjectID <> (
SELECT  Distinct(BS_Subject.SubjectID) 
FROM   dbo.BS_Subject, dbo.BS_SubjectToClass 
Where  BS_Subject.SubjectID = BS_SubjectToClass.SubjectID 
And BS_SubjectToClass.ClassID = 2) 
+0

Potrebbe volerlo riformulare e riformattare per avere un senso. –

risposta

34
SELECT SubjectID, DepartmentID, SubjectName, SubjectDescription, SubjectShortCode 
FROM BS_Subject 
WHERE NOT EXISTS 
(SELECT SubjectToClassID FROM BS_SubjectToClass WHERE 
BS_Subject.SubjectID = BS_SubjectToClass.SubjectID 
AND BS_SubjectToClass.ClassID =2) 
+0

Questo non funzionerà in SQL Studio o Visual Studio. – tcables

+1

@tcables In che modo non funziona in SSMS o Visual Studio? Si esegue perfettamente per me in SSMS 2008 e Visual Studio 2012. –

+0

SQL Studio non ha gradito la dichiarazione dopo WHERE NOT EXISTS. Potrebbe essere che era solo la mia configurazione, ma quando ho sostituito i nomi delle colonne nella risposta qui sotto, ha funzionato. – tcables

11

È necessario utilizzare il NOT IN operatore - non il <> (che è VB o qualcosa ....)

SELECT 
    DISTINCT(BS_Subject.SubjectID) DepartmentID, 
    SubjectName, SubjectDescription, SubjectShortCode 
FROM dbo.BS_Subject 
WHERE 
    BS_Subject.SubjectID NOT IN 
     (SELECT DISTINCT(BS_Subject.SubjectID) 
     FROM dbo.BS_Subject, dbo.BS_SubjectToClass 
     WHERE BS_Subject.SubjectID = BS_SubjectToClass.SubjectID 
     AND BS_SubjectToClass.ClassID = 2) 
+0

Fatto divertente, puoi usare ['<>' come pure '! =' In MS SQL] (http://stackoverflow.com/questions/723195/should-i-use-or-for-not-equal- in-tsql) (anche se non è ancora lo stesso di 'NOT IN'). – Hannele

Problemi correlati