항목/속성 목록에 여러 속성이있는 항목을 선택하려면 SQL 문은 무엇입니까?
-
06-09-2019 - |
문제
항목과 속성이 나열된 테이블이 있다고 말합니다.
frog green
cat furry
frog nice
cat 4 legs
frog 4 legs
항목 열에서 녹색과 4 개의 다리 속성이 모두있는 고유 한 객체를 선택하려고합니다. 이 경우 개구리 개체 만 다시 돌아올 것으로 예상됩니다. 이 작업을 수행하는 가장 효율적인 쿼리는 무엇입니까?
해결책
select item.name
from item
where item.attribute in ('4 legs', 'green')
group by item.name
having count(distinct item.attribute) = 2
다른 팁
이를 수행하는 가장 효율적인 방법은 자체 합의입니다.
SELECT * FROM attributes a1
JOIN attributes a2 USING (item_name) -- e.g. frog
WHERE a1.value = 'green' AND a2.value = '4 legs';
일부 사람들이 사용하는 또 다른 솔루션은 그룹의 트릭입니다.
SELECT item_name FROM attributes
WHERE value IN ('4 legs', 'green')
GROUP BY item_name
HAVING COUNT(*) = 2;
그러나 솔루션 별 그룹은 어떤 브랜드의 RDBM을 사용하는지에 따라 조인만큼 효율적이지 않을 수 있습니다. 또한 테이블의 볼륨이 증가함에 따라 하나의 방법이 더 잘 확장 될 수 있습니다.
the thing = '개구리'에서 *에서 * 선택
당신이 원하는 것을 외롭게 아는 것보다 능가하는 것은 없습니다.
select
item, count(*)
from
@temp
where
attribute in ('4 legs','green')
group by
item
having
count(*) = 2 -- this "2" needs to be replaced with however many attributes you have
각 속성을 별도로 쿼리 한 다음 교차 할 수도 있습니다.
/*
-- create sample table...
create table #temp1
(item varchar(max),
attrib varchar(max))
-- populate sample table (SQL 08)...
insert #temp1
values ('frog', 'green'), ('cat', 'furry'), ('frog', 'nice'), ('cat', '4 legs'), ('frog', '4 legs')
*/
SELECT item
FROM #temp1
WHERE attrib = 'green'
INTERSECT
SELECT item
FROM #temp1
WHERE attrib = '4 legs'
두 개의 테이블, 항목 중 하나와 속성 중 하나를 만듭니다.
INTATTRIBITEID는 속성 테이블에 대한 외국의 키 참조 인 IntattRibuteId라는 이름이 될 수 있습니다. 이렇게하면 관심있는 모든 것을 기반으로 일부 명령문을 수행 할 수 있습니다.
그러나 아마도 이것은 당신을 도울 수 있습니다 :
SELECT *
FROM tbl t1
INNER JOIN tbl t2 ON t1.Name = t2.Name
WHERE t1.Attribute = 'green' AND t2.Attribute = '4 legs'
정규화 된 모델이 아니기 때문에 힘들다. 주말입니다.
연결되지 않은 여러 행에 걸쳐 필터링되므로 각 속성을 차례로 추출한 다음 항목과 일치시켜야합니다.
SELECT
item
FROM
(SELECT
item
FROM
Mytable
WHERE
attribute = '4 legs') k1
JOIN
(SELECT
item
FROM
Mytable
WHERE
attribute = 'green') k2 ON k1.item = k2.item
가능하면 재 설계 할 것입니다. 이것은 당신이 12 값을 동시에 효과적으로 쿼리 할 수있는 것이 아닙니다 (12 개의 조인이 필요합니다).
이 Wikipedia 기사를 읽으십시오http://en.wikipedia.org/wiki/entity-attribute-value_model#downsides
결국 심각한 성능 문제가 발생하지 않은이 모델을 사용한 데이터베이스를 본 적이 없습니다. 이 디자인은 비-다 바이스 사람들에게 우아 해 보이지만 실제로는 일반적으로 잘못 설계된 데이터베이스의 표시입니다.