如何从b表sql server中只从匹配的给定id中选择行

b1zrtrql  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(326)

下面是一个示例表。我在表a和表b之间使用一个内部联接,只想从表a中选择与给定id的表b中的所有行相匹配的行。例如,我只想显示表a中的行,其中表b id为27和65,表a必须与表b中id为27和65的行有关系才能显示在结果中。
问:在这个例子中,如何创建这样的查询?

A          B
-----      -----
id         id
name       a_id
           value

希望你能理解我上面的例子,任何帮助或输入都非常感谢,谢谢!

pokxtpni

pokxtpni1#

这里我的评论作为答案-看起来,它既适用于多个匹配项,也适用于混合结果(匹配项+附加行):

CREATE TABLE TabA(
  ID int
  ,Name nvarchar(100)
 )

 CREATE TABLE TabB(
  ID int
  ,a_ID int
  ,Val decimal(19,4)
 )

 INSERT INTO TabA VALUES
(1, N'Test1 - two matches')
,(2, N'Test2 - one match')
,(3, N'Test3 - two matches + 1')
,(4, N'Test4 - two matches not unique')
,(5, N'Test5 - no matches')

INSERT INTO TabB VALUES
(27, 1, 0.5)
,(65, 1, 0.75)
,(27, 2, 1)
,(27, 3, 1.5)
,(65, 3, 2.5)
,(68, 3, 2.5)
,(27, 4, 1.5)
,(65, 4, 2.5)
,(27, 4, 3.5)
,(65, 4, 4.5)
,(1, 6, 0)
GO

WITH cte AS(
SELECT a.id, a.name, b.id AS b_id, SUM(b.val) AS val
  FROM TabA a
  JOIN TabB b ON b.a_id = a.id AND b.ID IN (27, 65)
  GROUP BY a.id, a.name, b.id
)
SELECT x.ID, x.Name
FROM(
  SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY b_id) rn
    FROM cte c
) x
WHERE rn = 2

结果如下:

详见小提琴:http://sqlfiddle.com/#!18/aa6ec5/13/1号文件

2exbekwf

2exbekwf2#

如果蒂龙78的建议是正确的,那就是暗中捅一刀。似乎,也许,是 HAVING 一些条件聚合将起作用:

SELECT A.id,
       A.[name]
FROM A
     JOIN B ON A.id = B.a_id
GROUP BY A.id,
         A.[name]
HAVING COUNT(CASE WHEN B.id WHEN 27 THEN 1 END) > 0
   AND COUNT(CASE WHEN B.id WHEN 65 THEN 1 END) > 0;

这是假设 a.id 是唯一的(它毕竟是一个id),但是这假设 b.id 不是独一无二的;因为如果 B.Id 是唯一的,那么这将(再次)只需要一个 JOIN :

SELECT A.id,
       A.[name]
FROM A
     JOIN B27 ON A.id = B27.a_id
     JOIN B65 ON A.id = B65.a_id
WHERE B27.Id = 27
  AND B65.ID = 65;

不过,前者的性能可能会(稍微)更好,因为它只需要在表中进行一次查找 B ,而不是2。

相关问题