如何返回仅与特定属性有关的SQL结果?
我有一张类似于以下内容的表格:如何返回仅与特定属性有关的SQL结果?,sql,Sql,我有一张类似于以下内容的表格: 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 SELECT a.ID, a.Title, c.AttributeTypeID, COUNT(b.AttributeValueID)AS Tot
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
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
我有另一个表,它按类型对这些AttributeValueId进行分组:
TBL_AttributeValues:
AttributeValueID AttributeTypeID
1319 1
1320 1
1321 1
1336 2
1344 3
1345 3
我有第三个表,提供了第一个表中每个ID的信息:
TBL_Aids:
ID Title Author etc.
101 Aid About Spiders John Doe
102 Aid About Mites Jane Doe
103 Aid About Beetles Joe Schmo
我想返回只包含AttributeValueIDs 1319或(包括)1320的ID的结果(以及关于它们的信息,如标题、作者等),在AttributeTypeID=1内。所以我希望返回101,因为它的AttributeType 1只有1319和1320,还有103,因为它的AttributeType 1只有1320。我不想返回102,因为尽管它有1319和1320,但它也有1321,这也是AttributeType 1
我尝试了以下方法:
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
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
选择a.ID、a.Title、c.AttributeTypeID、,
将(b.AttributeValueID)计数为总计
从TBL_Aids作为一个,
将属性值与辅助值关联为b,
TBL_属性值为c
其中a.ID=b.AidID
b.AttributeValueID=c.ID
a.状态=2
和AttributeTypeID=1
和(b.AttributeValueID=1319
或b.AttributeValueID=1320)
按a.ID、a.标题分组,
c、 属性肽
拥有COUNT(b.AttributeValueID)尝试:
尝试:
您想限制您的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
)
如果仅当这两个属性存在时才需要,请尝试以下操作:
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
您想限制您的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
)
如果仅当这两个属性存在时才需要,请尝试以下操作:
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
我认为您需要以某种方式添加“不存在”:
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
)
我认为您需要以某种方式添加“不存在”:
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
)
您需要两次加入到REL_Aid_to_AttributeValue,以确保存在两行
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;
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
,你需要加入两次REL\u Aid\u to\u AttributeValue以确保两行存在
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;
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;
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
)
另外,如果你知道你有什么值,你就知道有多少,所以这是一个文本2
,你需要加入两次REL\u Aid\u to\u AttributeValue以确保两行存在
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;
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;
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
)
注意,我已将您的查询转换为更现代的“join”语法。我建议你学一下
还要注意的是,如果您知道自己有哪些值,那么您就知道有多少个值,因此这是一个文本2
,您需要两次连接到REL\u Aid\u to\u AttributeValue以确保存在两行
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;
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;
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
)
注意,我已将您的查询转换为更现代的“join”语法。我建议你学一下
还要注意的是,如果您知道自己有哪些值,那么您就知道有多少个值,因此它是一个文本2
,这要感谢Quassnoi:
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
)
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
多亏了卡西诺:
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
这不太正确,但对我来说似乎有道理。它只返回大约100个结果,但我估计结果集接近700个。而且更重要的是,结果是不准确的。它们既有属性值1319和1320,也有其他属性值。是的,我很少使用join,因为我没有看到它比我使用的方式有什么好处。如果它在这种情况下起作用,我会被说服的!谢谢你的建议。这不太正确,但对我来说似乎有意义。它只返回大约100个结果,但我估计结果集接近700个。而且更重要的是,结果是不准确的。它们既有属性值1319和1320,也有其他属性值。是的,我很少使用join,因为我没有看到它比我使用的方式有什么好处。如果它在这种情况下起作用,我会被说服的!谢谢你的建议。“不存在”似乎是个好主意,但我仍然不知道这将如何工作。AttributeValueID应该从REL_Aid_To_AttributeValue中选择,而AttributeTypeID只在TBL_AttributeValues中。这里不需要其他连接来关联这两个吗?这会起作用,因为它会拒绝AttributeTypeID属于给定类型但AttributeValueID不属于给定列表的行。对不起,我应该更好地解释它。我对上面的问题进行了编辑,以包括我需要从中获取信息的另一个表。AttributeValueID不在TBL_Aids中,AttributeTypeID也不在您所谓的AttributeValueID中(我想您指的是REL_Aid_To_AttributeValue?),没问题。我试图编辑答案以使用正确的表名,但结果对我来说太复杂了。我没弄错,“不存在”似乎是个好主意,但我还是不明白这是怎么回事。AttributeValueID应该从REL_Aid_To_AttributeValue中选择,而AttributeTypeID只在TBL_AttributeValues中。这里不需要其他连接来关联这两个吗?这会起作用,因为它会拒绝AttributeTypeID属于给定类型但AttributeValueID不属于给定列表的行。对不起,我应该更好地解释它。我对上面的问题进行了编辑,以包括我需要从中获取信息的另一个表。AttributeValueID不在TBL_Aids中,AttributeTypeID也不在您所谓的AttributeValueID中(我想您指的是REL_Aid_To_AttributeValue?),没问题。我试图编辑答案以使用正确的表名,但结果对我来说太复杂了。Quassnoi没有弄错。自行运行此子查询将返回除1319和1320(仍然是AttributeValueTypeID=1)之外的其他AttributeValueId的结果。那会发生吗?糟糕透了。这似乎是个好主意,但结果是0。谢谢你再试一次!单独运行此子查询将返回除1319和1320(仍然为AttributeValueTypeID=1)之外的其他AttributeValueId的结果。那会发生吗?糟糕透了。这似乎是个好主意,但结果是0。谢谢你再试一次!对不起,那部分我一定解释得不太清楚。我应该解释第三张表和标签