Join z funkcji skalarnej i tabeli

Odpowiedz Nowy wątek
2013-01-25 15:17
0

Cześć, mam taki problem. Piszę funkcje tabelaryczną, która ma zwrócić jeden wektor. Pierwszym elementem jest wynik działania pewnej funkcji skalarnej, a dalej jest zbiór danych. Problem jest taki, że zbiór danych może być pusty. I jeśli jest pusty, to wtedy wynik działania funkcji skalarnej jest zwracany też jako pusty(chociaż funkcja zawsze coś zwraca), a ma być widoczny. Innymi słowy, chcę zawsze uzyskać jakiś rekord.

Najpierw zrobiłem takie zapytanie:


SELECT dbo.funkcja(@param) as wynik_funkcji, *
from tabela
where kolumna = 0

Jednak jeśli nie ma rekordów w tabeli, gdzie kolumna = 0, wtedy jest zwracany całkowicie pusty zbiór(a chcę, żeby był wynik funkcji i dalej nulle).

Więc dalej spróbowałem z cross joinem:

SELECT a.wynik_funkcji, tab.*
from 
(
  select dbo.funkcja(@param) as wynik_funkcji
)as a
cross join tabela tab
where tab.kolumna = 0

Niestety efekt jest ten sam.

Jak to zrobić? Przypominam, że musi to być funkcja tabelaryczna działająca na MSSQL 2005.

Poczytaj o COALESCE, może tego Ci brakuje. - Hostel 2013-01-25 15:23

Pozostało 580 znaków

2013-01-27 12:39
0

Jednak nie. COALESCE służy do czegoś trochę innego. A jeśli to jest to, to nie mogę sobie wyobrazić, jak miałbym tego użyć.

Pozostało 580 znaków

2013-01-28 15:12
0

Jeżeli nie ma rekordów tabeli to where zawsze odrzuci wszystko możesz to rozwiazać tak:

SELECT a.wynik_funkcji, tab.*
from 
(
  select dbo.funkcja(@param) as wynik_funkcji
)as a
cross join 
(select * from tabela where kolumna = 0) tab

lub tak

SELECT a.wynik_funkcji, tab.*
from 
(
  select dbo.funkcja(@param) as wynik_funkcji
)as a
cross join 
 tabela  tab
where isnull(tabkolumna,0) = 0

Pozostało 580 znaków

2013-01-29 11:35
0

Niestety, to też nie działa.

Pozostało 580 znaków

2013-01-29 12:39

rzeczywiście nie zwróciłem uwagi na sprzężenie, użyj left joina:

SELECT a.wynik_funkcji, tab.*
FROM 
(
  SELECT dbo.funkcja(@param) AS wynik_funkcji
)AS a
LEFT JOIN 
(SELECT * FROM tabela WHERE kolumna = 0) tab on 1=1

Pozostało 580 znaków

2013-01-29 13:26
0

OK, dzięki to jest to.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0