Was ist eine SQL-Anweisung ein Element auszuwählen, die mehrere Attribute in einem Element / Attribut-Liste?

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

Frage

ich habe eine Tabelle, die wie aufgeführten Elemente und Attribute hat,

frog    green
cat     furry
frog    nice
cat     4 legs
frog    4 legs

Aus dem Artikel Spalte I einzigartige Objekte auswählen möchten, die sowohl die grüne und 4 Beine Attribut haben. Ich würde erwarten, nur den Frosch Objekt in diesem Fall zu kommen. Was ist die effizienteste Abfrage dies zu tun?

War es hilfreich?

Lösung

select  item.name 
from    item 
where   item.attribute in ('4 legs', 'green') 
group by item.name 
having  count(distinct item.attribute) = 2

Andere Tipps

Der effizienteste Weg, dies zu tun ist mit einer Selbstverknüpfung:

SELECT * FROM attributes a1 
JOIN attributes a2 USING (item_name) -- e.g. frog
WHERE a1.value = 'green' AND a2.value = '4 legs';

Eine andere Lösung, die einige Leute verwenden ist ein Trick, mit GROUP BY:

SELECT item_name FROM attributes
WHERE value IN ('4 legs', 'green')
GROUP BY item_name
HAVING COUNT(*) = 2;

Aber die GROUP BY-Lösung kann nicht so effizient sein wie ein JOIN, je nachdem, welche Marke von RDBMS Sie verwenden. Auch ein Verfahren kann skaliert besser als das Volumen in der Tabelle wächst.

select * from table where Ding = 'Frosch'

nichts geht genau zu wissen, was Sie wollen.

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

Sie auch jedes Attribut einzeln abfragen könnte, und dann schneiden sie ...

/*
-- 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'

Erstellen zwei Tabellen, eine der Elemente und ein von Attributen.
Artikel könnte nennen, intAttributeID, wo intAttributeID ist ein Fremdschlüssel Bezug auf die Attribute Tabelle. So können Sie eine select-Anweisung tun können, basiert weg, was Sie kümmern uns um.

Aber vielleicht kann dies helfen Ihnen:

SELECT * 
FROM tbl t1
INNER JOIN tbl t2 ON t1.Name = t2.Name
WHERE t1.Attribute = 'green' AND t2.Attribute = '4 legs'

Hard, weil es nicht ein normalisiertes Modell ist. Es ist ein Wochenende.

Sie sind Filterung über mehrere, nicht verbundenen Zeilen, so würden Sie jedes Attribut wiederum extrahieren und dann Elemente entsprechen.

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

Wenn möglich, würde ich neu zu gestalten. Das ist nicht etwas, das Sie jemals in der Lage sein, effektiv abfragen 12 Werte in der gleichen Zeit auf (es erfordert 12 Joins)

Bitte lesen Sie Wikipedia-Artikel http://en.wikipedia.org/wiki/Entity-Attribute-Value_model# Kehrseiten

Sie nie eine Datenbank noch nicht gesehen, die dieses Modell verwendet, das nicht schließlich in ernsthafte Performance-Probleme lief. Dieser Entwurf sieht elegant zu nicht-Datenbank Menschen aber ist eigentlich in der Regel ein Zeichen für eine schlecht gestaltete Datenbank.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top