Was ist eine SQL-Anweisung ein Element auszuwählen, die mehrere Attribute in einem Element / Attribut-Liste?
-
06-09-2019 - |
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?
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.