Jak určit 3 možnost   zodpovězená otázka

SQL

Ahoj potreboval bych poradit jak rozeznat třetí množnost.

mám treba select

select jmeno , 1 from jmena

union

select zakaznik , 2 from zakaznici

vysledek je:

aaa 1

bbb 1

ccc 1

xxx 2

yyy 2

aaa 2

potreboval bych aby se u duplicit zobrazila v druhem sloupci 3

(nevim jak tam nacpat podminku nebo jsem nasel FULLOUTER JOIN)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechápu, o co se pokoušíte? Vybrat záznamy, které jsou v tabulce Jmena i Zakaznici?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ne ne špatne jsem to popsal:

Mám dva selekty jeden sloupec vyhodi retezec a druhy je identifikator selektu (1,2)

Unionem (není podmínkou si je dám do jednoho)

a ted já potřebuju když bude stejný řetězec u obou aby identifikátor byl 3 a retezec se enzobrazoval duplicitně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Příjde mi že to máte divně navržené (ale samozřejmě neznám všechny aspekty). Co to zkusit jednoduše přes group by ? Tím vám ty duplicity zmizí a nemusíte tam čachrovat s těma číslama. Možná když vynecháte to číslo které označuje tabulku, tak ten union provede group by automaticky a jméno tam bude jen jednou (to si ale teď nejsem jistý a bude asi záležet i na tom jakou používáte databázi). Toto samozřejmě platí pouze pokud nepotřebujete zobrazovat ještě nějaké další sloupce.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za tip ,ale já tam právě potřebuju ty čísla kvuli dalšímu zpracování(zobrazení).

aa 1 - zobrazí barvou 1

bb 2 - zobrazí barvou 2

cc 3 (nachazi se v obou selektech) - ošetří data a zobrazí barvou 3

-- proste jednoduše potrebuju ve vysledku rozeznat z jakeho selektu je radek a podmínkou nejak udelat pokud se nachazi v obou zobrazit stav 3

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

třeba takto:

select j.jmeno ,
 (case when 
	(select count(*) from zakaznici z where z.zakaznik = j.jmeno) = 0 then 1 else 3 end) 
from jmena j

 union
 
 select zakaznik , 2 from zakaznici where zakaznik not in ( select jj.jmeno from jmena jj)

Nejspíše by to také šlo poskládat pomocí left join, inner join,right join a union.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

!! SMEKÁM PRESNĚ TOHLE JE ONO !!

!! Mockrát děkuji !!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tohle je asi dost pomalé (SELECT v SELECTu), nejjednodušší mi přijde tohle:

1) Vyberu si všechny unikátní názvy z obou tabulek.

2) Napojím si na ně jména a zákazníky pomocí LEFT JOIN - tzn. buď se hodnota napáruje, nebo bude NULL. A pak si přes CASE určím podle toho, co se podařilo napárovat, jestli je ten záznam v jedné tabulce nebo ve dvou.

Tady je to i s testovacími daty:

create table #jmena (jmeno nvarchar(50))
create table #zakaznici (zakaznik nvarchar(50))

insert into #jmena values ('aaa'), ('bbb'), ('ccc')
insert into #zakaznici values ('xxx'), ('bbb'), ('ddd')


with t1 as (
  select jmeno as jmeno from #jmena union select zakaznik as jmeno from #zakaznici
)
select t1.jmeno, (case 
    when (t2.jmeno is not null and t3.zakaznik is null) then 1 
    when (t2.jmeno is null and t3.zakaznik is not null) then 2
    else 3 end) as typ
  from t1 
  left join #jmena t2 on t1.jmeno = t2.jmeno 
  left join #zakaznici t3 on t1.jmeno = t3.zakaznik 
nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Jen taková poznámka pro ty co používají SQL server, subselecty opravdu bývají výrazně pomalejší, ale pokud tazatel používá novější SQL server, tak tam to je většinou jedno (SQL server pochopí co hledáte, ale nenechá si kecat do toho jak to má najít a sám zvolí nejrychlejší alternativu, takže je jedno jestli to děláte subselectem nebo joinem).

Ale tento konkrétní dotaz jsem netestoval a ani nevím zda uživatel má SQL server.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji všem zůčasněným většinou to bude pracovat s max 1000 záznamy takže myslím že to o tolik nezatíží server.

Pro informaci používáme MSSQL 2008R2 ale pojedeme na MSSQL 2012

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tomu řikám špatně designovaná DB a poté vznikají takto šíleně nesmyslné dotazy na jednoduché věci...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

To je dost odvážné tvrzení na to, že vidíte fragmenty dvou tabulek (nevíte, co je v nich za další sloupce) a vůbec nevíte, jak vypadá zbytek databáze.

Já si dovedu představit spoustu možností, kdy toto schéma má smysl, takže bych to rovnou neodsuzoval.

Samozřejmě je možné, že stávající rozdělení entit se jménem do dvou tabulek je nešťastné a stačila by jedna tabulky se sloupci název, je_jmeno, je_zakaznik nebo co to tam tazatel řeší. Případně mít tam přímo ty hodnoty 1,2,3. Ale to strašně záleží na tom, jak vypadají ostatní sloupce těch tabulek jmena a zakaznici.

Na základě toho, co vidíme, se prostě nedá posoudit, jestli je databáze navržená dobře nebo špatně. Můžeme si něco myslet, ale nemáme pro to objektivní podklad.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Každopádně...asi střílím moc rychle,ale je to zvyk z praxe,kde takovéto bastly nesmí existovat.Jakmile toto vidím,tak se mi kroutí prsty u nohou.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ne takhle to není. Zkusím objasnit co tímto dělám.

Ze základních dat v databázi procedurou vytváříme nové databáze bez nutnosti nejakeho importu nebo insertu. Zákazníkovy jedním klikem vytvorime potrebnou databázi kterou on potrebuje nebo kombinace jinych databázi. No aby nam to nepreteklo pres nos potreboval jsem vizuální kontolu toho zda objekt v db existuje i v zakladnich datech a naopak jestli v datech se nema vygenerovat nejaky objekt a nestalo se tak.

Tak jeden select pouzivam na vytazeni dat z nasi db a druhy vyuzivam k vytazeni dat ze sys.tables, view, columns atd. Tak a tim porovnavam zda jsou data schodna či se ma spustit ta a ta procedura na upravu db.

je to tak slozite ze jsem potreboval nejakou triviálnost která to udělá za mě.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

pokud je jmeno a zakaznik ve svých tabulkách jednoznačné, tak

select jmeno , cast(sum(kod1) as int) as kod 
from (
select jmeno , 1 as kod1 from jmena
union
select zakaznik as jmeno , 2 as kod1 from zakaznici
) t1
group by jmeno

ZK

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback