SQL 查询在其他列中获取具有差异值的公共列

SQL Query get common column with diff values in other columns

我对 SQL 不是很流利。我只是在制作最佳和高效的 sql 查询时遇到了一个小问题。我有一个 table,其中包含 A 列和 B 列的复合键,如下所示

A B C
1 1 4
1 2 5
1 3 3
2 2 4
2 1 5
3 1 4

所以我需要找到行,其中 C 列对于 A 列的特定值同时具有 4 和 5 的值(4 和 5 只是示例)。所以 4 和 5 存在于两个 A 值( 1 和 2)。对于 A 值 3,4 存在但 5 不存在,因此我们不能接受它。

我的解释很混乱。希望你能明白。

在此之后,我只需要找到 4(第一个数字)的 B 值小于 5(第二个数字)的 B 值的那些。在这种情况下,对于 A=1,第 1 行 (A-1, B-1,C-4) 的 B 值小于第 2 行 (A-1, B-2, C-5) 所以我们取这一行。对于 A = 2,第 1 行(A-2,B-2,C-4)的 B 值大于第 2 行(A-2,B-1,C-5)因此我们不能接受它。

我希望有人知道并提供帮助。谢谢

我假设您希望 a 的值是正确的。如果是这样,您可以使用聚合:

select a
from t
where c in (4, 5)
group by a
having count(distinct c) = 2;

包含给定 ac=4c=5 的行,并按 bc 以相同方式排序。

select a, b, c
from (
    select tbl.*, 
       count(*) over(partition by a) cnt,
       row_number() over (partition by a order by b) brn,
       row_number() over (partition by a order by c) crn
    from tbl
    where c in (4, 5)
) t
where cnt = 2 and brn = crn;

编辑

如果参数很重要,则必须明确设置参数的位置。将 b 排序与显式参数位置

进行比较
with params(val, pos) as (
    select 4,2 union all
    select 5,1
)
select a, b, c
from (
    select tbl.*, 
       count(*) over(partition by a) cnt,
       row_number() over (partition by a order by b) brn,
       p.pos
    from tbl 
    join params p on tbl.c = p.val
) t
where cnt = (select count(*) from params) and brn = pos;