Tomasz Mikołajczyk

Tomasz Mikołajczyk nauczyciel, trener
IT, Software QA
Manager

Temat: Dwa selecty i mój brak skilla :/

Mam dwa zamieszane selecty i potrzebuje połączyć je w jeden

Pierwszy:

SELECT * FROM firmy a, firmy_kluczowe b WHERE b.id_klucz in (select id_klucz from kluczowe where nazwa_klucz like '%wzorzec%') AND a.id_firmy = b.id_firmy group by a.id_firmy


Drugi:

SELECT * FROM firmy a, firmy_kluczowe b WHERE nazwa_f_pelna like '%wzorzec%' group by a.id_firmy


Oddzielnie się wykonują tak jak tego sobię życze, ale jak je połączyć zręcznie?Tomasz M. edytował(a) ten post dnia 22.04.10 o godzinie 22:12

konto usunięte

Temat: Dwa selecty i mój brak skilla :/

W jaki sposób to ma być połączone? Co ma być zwrócone?
Karol Murawski

Karol Murawski Administrator
Systemów IT

Temat: Dwa selecty i mój brak skilla :/

Witam ;)

Twój SQL aby spełniał oddzielnie oba warunki to możesz połączyć przez - "OR" tj:


SELECT * FROM firmy a, firmy_kluczowe b WHERE
(
(b.id_klucz in (select id_klucz from kluczowe where nazwa_klucz like '%wzorzec%'))
OR (nazwa_f_pelna like '%wzorzec%')
)
AND a.id_firmy = b.id_firmy
group by a.id_firmy


Możesz także obadać UNION ;)

Pytanie - Co chcesz uzyskać? Czy wyniki obu razem, czy też ten drugi ma być zawężeniem wyszukiwania dla pierwszego?
Tomasz Mikołajczyk

Tomasz Mikołajczyk nauczyciel, trener
IT, Software QA
Manager

Temat: Dwa selecty i mój brak skilla :/

oba razem, czyli powinienem uzyskac WYNIK_SUMA = wynik_1 + wynik_2 (eliminujac powtorzenia w sumie tych wynikow sprawdzajac po unikalnym id_firmy)

Temat: Dwa selecty i mój brak skilla :/

Jeśli chcesz połączyć wyniki to skorzystaj ze wspomnianego operatora UNION. Później możesz sobie te dane pogrupować po id (GROUP BY id) i rekordy nie będą się powtarzać.
Tomasz Mikołajczyk

Tomasz Mikołajczyk nauczyciel, trener
IT, Software QA
Manager

Temat: Dwa selecty i mój brak skilla :/

super, pomogliscie mi. A na marginesie - jak usprawnic moje zapytania? Tzn obecnie mam tak:

Select1 z ograniczeniami UNION Select2 z ograniczeniami

niby fajnie ale ograniczen typu and costam and costam and costam... mam duzo. ALE one sa IDENTYCZNE w 1 oraz 2 select.

Ja chcialbym
[ Select1 UNION Select2 } + wspolne ograniczenia;

Tak zeby nie dublowac. Da sie? :):)
Karol Murawski

Karol Murawski Administrator
Systemów IT

Temat: Dwa selecty i mój brak skilla :/

Nie musisz korzystać z UNION'a.

Jeśli chcesz wyodrębnić z obu a jednocześnie chcesz mieć grupowanie to powinno zadziałać z OR tylko inaczej ustawione nawiasy ;)...

tj.

SELECT * FROM firmy a, firmy_kluczowe b WHERE
(
(b.id_klucz in (select id_klucz from kluczowe where nazwa_klucz like '%wzorzec%') AND a.id_firmy = b.id_firmy)
OR (nazwa_f_pelna like '%wzorzec%')
)
group by a.id_firmy


Nie znam schematu Twojej bazy, ale powinno zadziałać ;)
Michał Płonka

Michał Płonka Programista PHP

Temat: Dwa selecty i mój brak skilla :/

Tomasz M.:
Ja chcialbym
[ Select1 UNION Select2 } + wspolne ograniczenia;

Tak zeby nie dublowac. Da sie? :):)
Da się:
SELECT * FROM (
(SELECT * FROM tabela_1)
UNION
(SELECT * FROM tabela_2)
) AS t WHERE [warunki]

Będzie to chyba wolniejsze bo "łączysz" ze sobą X tabel (wszystkie rekordy z nich), a dopiero później przeszukujesz cały zbiór pod kątem konkretnych warunków. Przenosząc warunki do podzapytania (do UNIONów) już na tym poziomie ograniczasz zbiór wynikowy. Ponadto jeśli masz pozakładane indeksy na polach po których szukasz, to wydaje mi się (!), że w takiej formie indeksy nie zostaną użyte (warunki wyrzucone poza SELECT na danej tabeli).

Temat: Dwa selecty i mój brak skilla :/

W niektórych przypadkach UNION powinien automatycznie usunąć powtarzające się rekordy. Jeśli tego nie robi, to wystarczy, że pogrupujesz wyniki zwrócone przez zapytanie, które zamieścił przedmówca wg tej kolumny lub kolumn, które nie mają się powtarzać. Możesz też pokombinować z DISTINCT po operatorze SELECT, ponieważ usuwanie duplikatów w trakcie zapytania jest szybsze, niż grupowanie danych po ich pobraniu.Piotr Wittchen edytował(a) ten post dnia 23.04.10 o godzinie 20:03

Następna dyskusja:

Brak pełnej nazwy z bazy




Wyślij zaproszenie do