【问题标题】:SQL Server : Select Inner JoinSQL Server:选择内部联接
【发布时间】:2017-01-01 02:49:55
【问题描述】:

我正在尝试构建一个查询来为我提供一些信息,以便对两个表进行内部连接,tableAtableB。它们的外观如下:

表A

ClientID     RevNo     RevPurp
------------------------------
123          4557      1
124          4555      1
123          6574      2
123          7857      3
124          8987      2

表B

RevNo        ClientID     Active 
------------------- -------------
4557         123          True
6574         123          True
7857         123          True
8987         124          True
4555         124          True

这就是我想要做的。我正在努力...

Select Distinct ClientID 
From TableB 
Inner Join TableA On tableB.RevNo = tblB.RevNo 
Where RevPurp is not 3.

RevPurp 可以是 1,2,3 - 我只是想选择那些可以有 1,2 但不能有 3 的不同客户端。

查看表中的数据,我应该只有 1 条记录....

124

因为客户端 123 具有 RevPurp 3。因此,如果客户端具有 RevPurp 3,我不想在执行查询时看到该客户端!

编辑 - 我在表 B 中添加了一个名为 ACTIVE 的字段。进行查询时,我需要确保 Active = True!

【问题讨论】:

  • 我看不到 TableB 的用途。你可以从TableA中得到你需要的结果
  • @devlincarnate 我需要使用该表,因为那是我的 WHERE 过滤器所在的位置。
  • @Bobski:where 过滤器是什么?您在TableB 上没有任何信息。除非你遗漏了一些细节。
  • 这些表明显不完整,字段比较多,需要Select from TableB和inner Join TableA——后面会加过滤器。
  • 嗯,这并不明显。请输入足够的信息以便我们了解完整的问题,或者至少输入足够的部分以便我们了解问题。

标签: sql sql-server-2008 select inner-join distinct


【解决方案1】:

正如@devlin 在评论中提到的,您不需要 tableB 来执行此操作: 您需要 TableA 中唯一(不同)ClientId 的列表,其中 tableA 中没有 RevPurp 值为 3 的记录。

编辑:在TableB.Active 上添加过滤谓词

Select distinct a.ClientId 
from tableA a join tableb b 
   on b.RevNo = a.RevNo
Where b.Active = 1  -- <===== is Active a BIT field
  and Not exists
   (Select * from tableA 
    Where ClientId = a.ClientId 
       and RevPurp = 3)

【讨论】:

  • 我需要它从 TableB 内部加入到 TableA 中选择,因为我需要在 WHERE 语句中使用 tableB 来获取更多条件
  • 好吧,然后从 TableB 中列出您需要的标准(您需要实施的过滤或排序规则)作为您问题的一部分。否则我们会回答错误的问题。
  • @CharlesBretana bit
【解决方案2】:

你可以试试不进去

Select Distinct ClientID 
from TableB 
inner join TableA on tableB.RevNo = tblB.RevNo 
where tableA.ClientID not in (select ClienID from tableA where RevPurp = 3)

【讨论】:

    【解决方案3】:

    带有having 子句的简单group by 应该可以工作:

    select clientId
      from tableA
     group by clientId
    having count(*) = count(case when RevPurp <> 3 then 'X' end)
    

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 2010-12-26
      • 2012-01-28
      • 2016-04-14
      • 2014-07-10
      • 2023-02-16
      • 2013-07-28
      • 2010-11-23
      相关资源
      最近更新 更多