选择多个子句

时间:2012-04-22 04:15:03

标签: sql sql-server stored-procedures

模式

我有3个表格,其中包含以下列:

tblClients [ClientID, ClientName, Client Contact]
tblEvents [EventID, EventName]
tblEventBook [EventBookID, EventID, ClientID]
  • tblEventBook EventID匹配tblEvents EventID
  • tblEventBook ClientID匹配tblClients ClientID

我有两个参数:@useEventID@useClientID

我想检索tblClient tblEventBook不等于useEventIDuseClientID的所有行。

我尝试使用以下内容,但它不起作用:

SELECT * 
FROM tblClients 
WHERE tblEventBook.EventID <> @useEventID 
  AND tblEventBook.ClientID <> @useClientID

示例数据:

tblEventBook

EventBookID EventID ClientID 
1           1          1 
2           2          2
3           3          1
4           4          2

tblClients

ClientID ClientName  ClientContact
1        TestNameA   12345
2        TestNameB   54321

tblEvents

EventID EventName
1       TestEventA
2       TestEventB
3       TestEventC
4       TestEventD
5       TestEventE

必填结果

我使用时需要获得以下结果:

  1. @useClientID = 1, @useEventID = 1

    应该返回ClientID 2

  2. @useClientID = 2, @useEventID = 1

    应该返回ClientID 1 and 2

  3. @useClientID = 2, @useEventID = 2

    应该返回ClientID 1

  4. @useClientID = 5, @useEventID = 2

    应该返回ClientID 1 and 2

5 个答案:

答案 0 :(得分:1)

我不是100%肯定你在这里想做什么,但试试这个:

SELECT * FROM tblEventBook

WHERE 

EventID <> @useEventID 

AND

ClientID <> @useClientID

答案 1 :(得分:1)

如果没有一些样本数据和期望的结果,确切地确定你所追求的是什么,但这是我对你的单词问题的第一次猜测:

SELECT c.ClientID, c.ClientName, c.[Client Contact],
    e.EventID, e.EventName,
    eb.EventBookID
  FROM dbo.tblClients AS c
  LEFT OUTER JOIN dbo.tblEventBook AS eb
  ON c.ClientID = eb.ClientID
  LEFT OUTER JOIN dbo.tblEvents AS e
  ON eb.EventID = e.EventID
  WHERE eb.EventID <> @useEventID
  AND eb.ClientID <> @useClientID;

答案 2 :(得分:1)

如果我理解你的要求:

SELECT        *
FROM           tblClients
WHERE        (ClientID IN
                             (SELECT        ClientID
                               FROM            tblEventBook
                               WHERE        (ClientID <> @useClientID) AND (EventID <> @useEventID)))

答案 3 :(得分:1)

此解决方案将排除所有与@useClientID相关的tblClients以及与@useEventID匹配的相关tblEventBook:

select * from tblClients c
where c.ClientID <> @useClientID
and not exists(select 1 from tblEventBook where ClientID=c.ClientID and EventID=@useEventID)

但是根据你的描述我也看到了一个略有不同的可能性,如果存在一个有@useClientID和@useEventID的相关tblEventBook记录,我们只排除tblClients:

select * from tblClients c
where not exists(
    select 1 from tblEventBook 
    where ClientID=c.ClientID 
    and EventID=@useEventID
    and ClientID=@useClientID
)

答案 4 :(得分:1)

试试这个

select *
from  @tblClients c
join @tblEventBook eb
on c.ClientID = eb.ClientID
where c.ClientID != @useClientID
and eb.EventBookID != @useEventID