Sql查询仅获取包含特定列中给定值的记录

时间:2018-02-11 06:02:21

标签: sql postgresql

我有以下表格:

表A

.get_object()

表C [Cid,X],其中Cid为表A中的外键。

我希望从表A中获取包含Jids J1和J2的所有CId。对于上表,我想返回C1作为输出。如果我输入一个AND子句,我就不会得到任何记录,如果我为J列添加一个OR子句,我也会在输出中得到C2。请协助。

5 个答案:

答案 0 :(得分:2)

您可以使用HAVING COUNT ( DISTINCT) CASE块 或者,如Salman所建议的那样,将其过滤在where子句中。

SQL Fiddle

PostgreSQL 9.6架构设置

CREATE TABLE TableA
    (Aid varchar(3), Cid varchar(3), Jid varchar(3))
;

INSERT INTO TableA
    (Aid, Cid, Jid)
VALUES
    ('A1', 'C1', 'J1'),
    ('A2', 'C1', 'J2'),
    ('A3', 'C2', 'J1'),
    ('A4', 'C2', 'J3'),
    ('A5', 'C2', 'J3'),
    ('A7', 'C3', 'J2'),
    ('A8', 'C3', 'J2'),
    ('A9', 'C4', 'J1'),
    ('A10','C4', 'J1'),
    ('A11','C1', 'J3'),
    ('A12','C1', 'J2')

;

查询1

SELECT cid
FROM   TABLEA
GROUP  BY cid
HAVING COUNT (DISTINCT CASE jid
                         WHEN 'J1' THEN 'J1'
                         WHEN 'J2' THEN 'J2'
                       END) = 2

<强> Results

| cid |
|-----|
|  C1 |

查询2

SELECT cid
  FROM   TABLEA
  WHERE jid IN ('J1', 'J2')
    GROUP  BY cid
 HAVING COUNT ( DISTINCT jid ) = 2

<强> Results

| cid |
|-----|
|  C1 |

答案 1 :(得分:1)

自我加入解决方案

此自我加入将为您提供必要的组合:

select distinct a1.Cid
    from A as a1
    inner join A as a2 on a2.Cid = a1.Cid
    where a1.Jid = 'J1' and a2.Jid = 'J2'

注意:它仅适用于2个Jid的测试。

我希望这会有所帮助。

答案 2 :(得分:0)

  

从表A中获取包含Jids J1和J2

的所有CId

这意味着查询结果将包含基于表A中数据的C1和C2,因此不会发生以下情况。

  

我想将C1作为输出返回

答案 3 :(得分:0)

SELECT DISTINCT Cid
FROM Table_A a
JOIN Table_A b
ON a.Cid = b.Cid
WHERE a.Jid = 'J1'
AND b.Jid = 'J2';

答案 4 :(得分:0)

试,

    select distinct cid from TableA  a  outer  apply 
 (select jid from TableA where jid='J2' and cid=a.Cid) b 
where a.jid='J1' and  b.jid is not null