Mam zapytanie do przecięcia trzech zapytań w oparciu o trzy podane parametry.
Zrobiłem to, używając prostego przecięcia jako czegoś takiego
Select name, email from table1 where param="p1"
intersect
Select name, email from table1 where param="p2"
intersect
Select name, email from table1 where param="p3"
Ale czasem problem jest nielicznyparametry bez danych lub puste. w takim przypadku zapytanie nic nie powoduje z powodu przecięcia z pustymi danymi. Jak więc poradzić sobie z tą sytuacją, aby w przypadku braku danych dla jednego parametru (spośród dowolnego z 3) kwerenda ta nie była rozpatrywana w całości
Odpowiedzi:
2 dla odpowiedzi № 1Dlaczego używasz INTERSECT
trzy razy w tej samej kolumnie? INTERSECT
jest w zasadzie an INNER JOIN
. Jak już wspomniano, ŁĄCZENIA WEWNĘTRZNE zgodnie ze schematem VENN zwracają tylko zestawy wyników znalezione w każdym kolejnym zapytaniu (co oznacza, że {A} U {B} NIE jest taki sam jak {A} U {C})
W rzeczywistości twoje pytanie nie odpowiada, czy parametr jest @variable
, w takim przypadku ze względów indeksowych należy użyć parametru do przeniesienia do zmiennej przed przekazaniem go do zapytania. W przeciwnym razie zapytanie nie będzie korzystało z SARG
Zamiast tego użyj następujących poleceń:
DECLARE @Param [DATA_TYPE]{#}
, @Param2 [DATA_TYPE]{#}
, @Param3 [DATA_TYPE]{#}
SET @Param = [USP_Proc @param = "p1"]
, @Param2 = [USP_Proc @param = "p2"]
, @Param3 = [USP_Proc @param = "p3"]
SELECT NAME
, EMAIL
FROM table1
WHERE col_1 = @param
OR col_1 = @param2
OR col_1 = @param3
0 dla odpowiedzi nr 2
Przecięcie zwraca wartości tylko wtedy, gdy wartości w zapytaniu A istnieją również w zapytaniu B, a także w zapytaniu C.
Tak więc w pierwszym przykładzie istnieje wartość „A”wszystkie trzy zapytania, więc zwróci „A”. W drugim przykładzie, gdy przecinasz trzy zapytania, a „A” nie istnieje we wszystkich trzech zapytaniach, więc nie zwraca żadnych wartości. Możesz użyć „Union” zamiast „Intersect”, ponieważ zwraca dane, gdy wartości istnieją w zapytaniu A, B lub C, jak pokazano w trzecim przykładzie, który zwróciłby wartości zarówno „A”, jak i „B”.
Example 1:
SELECT "A"
intersect
SELECT "A"
intersect
SELECT "A"
Example 2:
SELECT "A"
intersect
SELECT "A"
intersect
SELECT "B"
Example 3:
SELECT "A"
UNION
SELECT "A"
UNION
SELECT "B"