在条目表中具有所有多个条件的sql

时间:2018-08-29 14:48:33

标签: sql sql-server

我一直在尝试使用连接,子查询连接,不存在子句来解决这个问题,而我一直无法提出能够产生正确结果的查询。

我有2个表的Trans和TransEntry

转换表(PRIMARY TransID)

TransID | Date 
-----------
1        1/1/18           
2        1/2/18          
3        1/3/18         

TransEntry表(PRIMARY TransEntryID)

TransEntryID | TransID |Item
-----------
1              1        A
2              1        B
3              1        C
4              2        A
5              2        D
6              2        F
7              3        A
8              3        B
9              3        G
10             3        C

我需要拥有TransEntry中的所有TransID,其中条目中有项A和项C,在我们的示例中,它将仅为TransID(1,3)

6 个答案:

答案 0 :(得分:1)

SELECT TransID FROM TransEntry WHERE Item = 'A'
INTERSECT
SELECT TransID FROM TransEntry WHERE Item = 'C'

答案 1 :(得分:0)

我认为类似的方法应该起作用:

SELECT TransID
FROM TransEntry
WHERE Item in ('A','C')
GROUP BY TransID
HAVING Count(DISTINCT Item) = 2;

Here's a sqlfiddle showing this

CREATE TABLE TransEntry(
   TransEntryID   INTEGER  NOT NULL PRIMARY KEY 
  ,TransID        INTEGER  NOT NULL
  ,Item           VARCHAR(1) NOT NULL
);
INSERT INTO TransEntry(TransEntryID,TransID,Item) VALUES
 (1,1,'A')
,(2,1,'B')
,(3,1,'C')
,(4,2,'A')
,(5,2,'D')
,(6,2,'F')
,(7,3,'A')
,(8,3,'B')
,(9,3,'G')
,(10,3,'C');

SELECT TransID
FROM TransEntry
WHERE Item in ('A','C')
GROUP BY TransID
HAVING Count(DISTINCT Item) = 2

+---------+
| TransID |
+---------+
|       1 |
|       3 |
+---------+

答案 2 :(得分:0)

我的回答没有亚伦的简洁,但如果有帮助的话:

SELECT
  TransID
FROM
  Trans
WHERE
  TransID IN ( SELECT TransID FROM TransEntry WHERE Item = 'A' ) AND
  TransID IN ( SELECT TransID FROM TransEntry WHERE Item = 'C' )

答案 3 :(得分:0)

您可以尝试以下操作:

select transId 
from
(
    select 
        TransID , 
        case when item = 'A' then 1 else 0 end as HasA,
        case when item = 'C' then 1 else 0 end as HasC
    from TransEntry
) a
group by transId
having sum(hasA) > 0 and sum(hasC) > 0

答案 4 :(得分:0)

您可以使用GROUP BY

SELECT TransID
FROM TransEntry
GROUP BY TransID
HAVING SUM(CASE WHEN item = 'A' THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN item = 'C' THEN 1 ELSE 0 END) > 0;

答案 5 :(得分:0)

SELECT     TransEntry.TransID, TransEntry.Item, GROUP_CONCAT(TransEntry.Item) AS items
FROM       TransEntry
group by   TransEntry.TransID Having Find_In_Set('A',items)>0 and Find_In_Set('C',items)>0

请参见jsfiddle