0

次のようなテーブルがあります。

REL_Aid_To_AttributeValue:
ID    AttributeValueID
101   1319
101   1320
101   1344
101   1345
102   1319
102   1320
102   1321
102   1336
103   1320
103   1336

これらの AttributeValueID をタイプ別にグループ化した別のテーブルがあります。

TBL_AttributeValues:
AttributeValueID    AttributeTypeID
1319                1
1320                1
1321                1
1336                2
1344                3 
1345                3

最初のテーブルの各 ID に関する情報を提供する 3 番目のテーブルがあります。

TBL_Aids:
ID     Title                Author       etc.
101    Aid About Spiders    John Doe
102    Aid About Mites      Jane Doe 
103    Aid About Beetles    Joe Schmo

AttributeTypeID=1 内に 1319 または (包括的) 1320 の AttributeValueID のみを含む ID (およびタイトル、作成者などの情報) の結果を返したいと考えています。したがって、AttributeType 1 には 1319 と 1320 しかないため、101 を返したいと思います。また、AttributeType 1 には 1320 しかないため、103 も返したいと思います。これも AttributeType 1 です。

私は次のことを試しました:

SELECT a.ID, a.Title, c.AttributeTypeID, 
COUNT(b.AttributeValueID)AS Total
FROM TBL_Aids as a,
REL_Aid_To_AttributeValue as b,
TBL_AttributeValues as c
WHERE a.ID=b.AidID
AND b.AttributeValueID=c.ID
AND a.Status=2
AND AttributeTypeID=1
AND (b.AttributeValueID=1319
OR b.AttributeValueID=1320)
GROUP BY a.ID, a.Title,
c.AttributeTypeID
HAVING COUNT(b.AttributeValueID) <= 2 

しかし、1319 と 1320 によって既に制限されており、タイプ 1 の AttributeValueID の合計ではなく、その合計をカウントしているため、結果として 102 が返されます。これを達成するには、何らかのサブクエリが必要ですか? どんな助けでも大歓迎です!どうもありがとう。

4

7 に答える 7

2

試す:

SELECT DISTINCT A.ID
FROM REL_Aid_To_AttributeValue A
WHERE A.AttributeValueID IN
(
    SELECT AttributeValueID
    FROM TBL_AttributeValues
    WHERE AttributeValueID IN (1319, 1320) AND AttributeTypeID=1
)
AND A.ID NOT IN
(
    SELECT A.ID
    FROM REL_Aid_To_AttributeValue A
    WHERE A.AttributeValueID IN
    (
        SELECT AttributeValueID
        FROM TBL_AttributeValues
        WHERE AttributeValueID NOT IN (1319, 1320)  AND AttributeTypeID=1
    )
)
于 2012-05-22T19:55:19.217 に答える
1
SELECT  id
FROM    (
        SELECT  DISTINCT id
        FROM    REL_Aid_To_AttributeValue a
        WHERE   attributeValueId IN (1319, 1320)
        ) q
WHERE   NOT EXISTS
        (
        SELECT  id
        FROM    (
                SELECT  AttributeValueID
                FROM    TBL_AttributeValues
                WHERE   AttributeTypeID = 1
                        AND AttributeValueID NOT IN (1319, 1320)
                ) t
        JOIN    REL_Aid_To_AttributeValue a
        ON      a.id = q.id
                AND a.AttributeValueID = t.AttributeValueID
        )
于 2012-05-22T20:30:14.373 に答える
0

なんらかの方法で「NOTEXISTS」を追加する必要があると思います。

SELECT DISTINCT ID
FROM TBL_Aids x
WHERE AttributeValueID IN
(
    SELECT AttributeValueID
    FROM AttributeValueIDs
    WHERE AttributeValueID IN (1319, 1320) AND AttributeTypeID=1
) AND NOT EXISTS
(
    SELECT *
    FROM AttributeValueIDs a
    WHERE a.AttributeValueID NOT IN (1319, 1320) AND a.AttributeTypeID=1
    AND a.AttributeValueIDs = x.AttributeValueIDs
)
于 2012-05-22T19:58:46.323 に答える
0

IDを制限したい。where 句のどこかに、次のようなものを含めることができます。

where id in (select distinct av.id
             from AttributeValueType avt join
                  AttributeValue av
                   on avt.AttributeValueId = av.AttributeValueId
             where avt.AttributeValueId in (1319, 1320) and avt.AttributeTypeID = 1
            )

これらの 2 つの属性が存在する場合にのみ必要な場合は、次のようにします。

Where id in (
    Select av.id
    From AttributeValueType avt join
         AttributeValue av
         on avt.AttributeValueId = av.AttributeValueId
    Group by av.id
    Having max(case when avt.AttributeValueId in (1319, 1320) and avt.AttributeTypeID = 1 then 0 else 1)=0
    Having max(case when 
于 2012-05-22T19:56:47.537 に答える
0

2 つの行が存在することを確認するには、REL_Aid_To_AttributeValue に 2 回結合する必要があります。

SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;

また、持っている値がわかっている場合は、いくつあるかがわかるので、それはリテラル2です。

于 2012-05-22T20:00:57.080 に答える
0

Quassnoi に感謝:

    SELECT ID, Title, Author
    FROM TBL_Aids X
    JOIN (
    SELECT AidID
    FROM    (
            SELECT  DISTINCT AidID
            FROM    REL_Aid_To_AttributeValue a
            WHERE   AttributeValueID IN (1319, 1320)
            ) q
    WHERE   NOT EXISTS
            (
            SELECT  AidID
            FROM    (
                    SELECT  ID
                    FROM    TBL_AttributeValues
                    WHERE   AttributeTypeID = 1
                            AND ID NOT IN (1319, 1320)
                    ) t
            JOIN    REL_Aid_To_AttributeValue a
            ON      a.AidID = q.AidID
                    AND a.AttributeValueID = t.ID
            ))
    Y ON X.ID=Y.AidID
    WHERE Status=2
于 2012-05-23T18:32:40.410 に答える
0

2 つの行が存在することを確認するには、REL_Aid_To_AttributeValue に 2 回結合する必要があります。

SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;

クエリをより最新の「結合」構文に変換したことに注意してください。学ぶことをお勧めします。

また、持っている値がわかっている場合は、いくつあるかがわかるので、リテラルであることに注意してください2

于 2012-05-22T20:02:42.580 に答える