SQL一对多在多个端中逐个匹配

SQL一对多在多个端中逐个匹配,sql,sql-match-all,Sql,Sql Match All,在下面的一对多 CREATE TABLE source(id int, name varchar(10), PRIMARY KEY(id)); CREATE TABLE params(id int, source int, value int); 其中params.source是source.id的外键 INSERT INTO source values(1, 'yes'); INSERT INTO source values(2, 'no'); INSERT INTO params VAL

在下面的一对多

CREATE TABLE source(id int, name varchar(10), PRIMARY KEY(id));
CREATE TABLE params(id int, source int, value int);
其中params.source是source.id的外键

INSERT INTO source values(1, 'yes');
INSERT INTO source values(2, 'no');

INSERT INTO params VALUES(1,1,1);
INSERT INTO params VALUES(2,1,2);
INSERT INTO params VALUES(3,1,3);

INSERT INTO params VALUES(4,2,1);
INSERT INTO params VALUES(5,2,3);
INSERT INTO params VALUES(6,2,4);
如果我有一个param值列表(比如[1,2,3]),我如何在SQL中找到包含列表中所有值(源1,“是”)的所有源


感谢

修改编辑以处理给定源的值可能多次出现的情况

试试这个:

SELECT
    *
FROM
    source
WHERE
    (
        SELECT COUNT(DISTINCT value)
        FROM params
        WHERE params.source = source.id
          AND params.value IN (1, 2, 3)
    ) = 3
您也可以通过以下方式将其改写为组:

SELECT
    source.*
FROM
    source
    INNER JOIN params ON params.source = source.id
WHERE
    params.value IN (1, 2, 3)
GROUP BY
    source.id,
    source.name
HAVING
    COUNT(DISTINCT params.value) = 3

您需要DISTINCT,因为您的params.value不会被阻止有重复项。

我希望其他人比我更了解这一点。。。你可能会考虑重新措词,我会用语法来确定这个组。更具表现力,看起来不那么痛苦。如果同一个源的参数中有多条记录具有相同的值,该怎么办?这是一个很好的问题。我想James需要告诉我们这是不是真的。好吧,DISTINCT从来不是我解决任何问题的第一个解决方案,在他的例子中,我见过很多次,多次具有相同值的设置是非典型的。但是我已经相应地修改了解决方案。如果您知道params表中不同值的数量,您可以在上面的WHERE子句中删除(1,2,3)中的params.values,也许可以使用一个int变量来匹配不同的计数。在lassevk实现相同的方法之前,这是最优雅的:)
SELECT s.*
FROM source AS s
 JOIN params AS p ON (p.source = s.id)
WHERE p.value IN (1,2,3)
GROUP BY s.id
HAVING COUNT(DISTINCT p.value) = 3;