2012-01-19 16 views
5

Mam listę wartości tak:Łączenie tabeli z listą

("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX") 

Chciałbym, aby móc wydobyć z tabeli, ile razy każdy z nich występuje w polu tabeli nawet wtedy, gdy liczba wystąpień 0.

Co szukam jest podobny do

select key_field, count(*) from table 
where key_field in ("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX") 
group by key_field; 

ale z pewnego rodzaju LEFT JOIN skutku.

Czy jest to możliwe w sql, a konkretnie w jego wariantach sqlite lub mysql?

Dzięki

+0

Czy próbowałeś wykonać zapytanie? Jaki był rezultat? –

+0

Wykonałem ekwiwalent dla mojej bazy danych (pola i wartości zostały zmienione w poście) i działa, ale gdy wartość na liście nigdy nie pojawia się w tabeli, nie otrzymuję wyniku dla tej wartości, a chcę zamiast tego wyprowadzać tj: "U5NF", 0 – simone

+0

twoje zapytanie nie będzie w stanie podać "0", ponieważ kryteria wyboru zapytania są takie, jeśli są obecne. Zero, które musisz uzyskać za pomocą innej logiki. – Nanda

Odpowiedz

2

Chciałbym użyć związku zbudować tablicę pamięci zamiast listy:

select t.code, count(mytable.unique_id) from 
    (
    select 'UXT8' as code union 
    select 'U61J' as code union 
    select 'U61W' as code union 
    select 'U62U' as code union 
    select 'X82U' as code union 
    select 'U5NF' as code union 
    select 'U635' as code union 
    select 'U526' as code union 
    select '28FX' as code 
) as t 
left outer join mytable on t.code = mytable.key_field 
group by t.code 
order by t.code; 
+0

Rzeczywiście przetestowałem to w mojej bazie danych. Działa poprawnie (oczywiście z nieco innymi nazwami i wartościami tabel). Prawo do dołączenia daje niepoprawny wynik, ponieważ pokazuje również nieistotne wartości z "mytable". – DRCB

+0

Tak, przepraszam, źle odczytałem pytanie! – newtover

1

tego zapytania nie tylko dlatego, że robi nie tak klawiszy z 0, ponieważ nie istnieje.

Więc to zrobić:

create table #temptable(
    key_field varchar(4) 
) 

insert into #temptable values ("UXT8"), ("U61J"), ("U61W"), ("U62U"), ("X82U"), ("U5NF"), ("U635"), ("U526"), ("28FX") 

i posłowia to zrobić wybierz:

select a.key_field, case when b.counter is null then 0 else b.counter end as counter from #temptable a 
left outer join 
(select key_field, count(*) counter from table 
where key_field in ("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX") 
group by key_field) b on a.key_field = b.keyfield 
0

Nie, nie można tego zrobić w SQL, z wyjątkiem, w dialektach, które obsługują pochodzących tabel, przez za pomocą bardzo brzydkiego podejścia obejmującego połączenie n wyborów w postaci "wybierz" utx8 '. Bardziej praktyczną alternatywą byłoby wstawienie tych wartości do tabeli tymczasowej i zewnętrznego sprzężenia do tego:

0

Wystarczy użyć not in aby dowiedzieć się key_fields które nie pasują do żadnej wartości z podanej listy.

select key_field, count(*) as counter 
    from table 
where key_field in ('UXT8','U61J','U61W','U62U','X82U','U5NF','U635','U526','28FX') 
group by key_field 

union all 

select key_field, 0 as counter 
    from table 
where key_field not in ('UXT8','U61J','U61W','U62U','X82U','U5NF','U635','U526','28FX') 
group by key_field; 

Wystarczy tylko dokonać union z drugą kwerendę, która wygląda jak pierwszy, ale z not in operatora i zerowym licznikiem.

+0

to nie daje tego, co OP chce – newtover

+0

@newtover Czy możesz mi wyjaśnić, dlaczego nie daje tego, co chce OP? –

+0

, ponieważ wyświetla listę wszystkich pól kluczy z 'table' z pewnymi liczbami zamiast pól key_fields na liście IN z ich liczbą. – newtover

0
SELECT key_field, COALESCE(cnt, 0) as cnt 
FROM (
    SELECT 'UXT8' AS key_field UNION ALL 
    SELECT 'U61J' AS key_field UNION ALL 
    SELECT 'U61W' AS key_field UNION ALL 
    SELECT 'U62U' AS key_field UNION ALL 
    SELECT 'X82U' AS key_field UNION ALL 
    SELECT 'U5NF' AS key_field UNION ALL 
    SELECT 'U635' AS key_field UNION ALL 
    SELECT 'U526' AS key_field UNION ALL 
    SELECT '28FX'  
) as f 
LEFT JOIN (
    SELECT key_field, count(*) as cnt 
    FROM thetable 
    WHERE key_field IN ("UXT8","U61J","U61W", 
         "U62U","X82U","U5NF", 
         "U635","U526","28FX") 
    GROUP BY key_field) as cnts 
USING (key_field); 
Powiązane problemy