항목/속성 목록에 여러 속성이있는 항목을 선택하려면 SQL 문은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/927724

문제

항목과 속성이 나열된 테이블이 있다고 말합니다.

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

결국 심각한 성능 문제가 발생하지 않은이 모델을 사용한 데이터베이스를 본 적이 없습니다. 이 디자인은 비-다 바이스 사람들에게 우아 해 보이지만 실제로는 일반적으로 잘못 설계된 데이터베이스의 표시입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top