Zupełnie nie rozumiem takiego zapytania z operatorem all, wytłumaczycie?

0

Dlaczego wyświetlane są wartości mniejsze niż 500, skoro w podzapytaniu ewidentnie są wartości większe niż 500?

SELECT * FROM Products
WHERE Price > ALL (SELECT Price FROM Products WHERE Price > 500);

sory, tutaj jest link//www.w3schools.com/sqL/trysql.asp?filename=trysql_op_all&ss=-1

0

spróbuj ANY zamiast ALL z drugiej strony dlaczego nie price > 500 zamiast podzapytania?

0

@woolfik: Ale ja chcę to zrozumieć zarówno dla ANY jak i dla ALL. Poza tym kliknij w link. Przykład wziąłem z w3schools i po prostu nie rozumiem. Podzapytanie dotyczy ewidentnie wartości większych od 500, a wyświetlane są mniejsze. Przecież to jest totalnie bez sensu i właśnie nie rozumiem dlaczego tak jest.

0
SELECT * FROM Products
WHERE productid = ANY (SELECT productid FROM Products WHERE Price > 50);

tu masz opis
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/some-any-transact-sql?view=sql-server-ver15

0

No na stronie, którą Ci podałem masz jasno opisane:
ALL requires the scalar_expression to compare positively to every value that is returned by the subquery. For instance, if the subquery returns values of 2 and 3, scalar_expression <= ALL (subquery) would evaluate as TRUE for a scalar_expression of 2. If the subquery returns values of 2 and 3, scalar_expression = ALL (subquery) would evaluate as FALSE, because some of the values of the subquery (the value of 3) wouldn't meet the criteria of the expression.

0

Nie no kurde, nie rozumiem. Sory. Może ktoś spróbuje jaśniej;-))

0

No ja po prostu nie rozumiem. Dlaczego w przypadku kodu poniżej wyświetlane są wartości Price < 500, skoro w podzapytaniu są wartości > 500.

SELECT * FROM Products
WHERE Price > ALL (SELECT Price FROM Products WHERE Price > 500);
0

Może zacznij od tego co zwraca podapytanie:

SELECT Price FROM Products WHERE Price > 500

Nie zwraca nic. Nie mogę znaleźć tego w dokumentacji, ale z tego co pamiętam all dla "pustego" podzapytania jest ewaluowane na true, odwrotnie do any które w tym przypadku jest ewaluowane do false

0

@Panczo: No okej, rozumiem, ale dlaczego w takim razie zapytanie z all'em gdy daje Price > 40 to nie wyświetla mi z kolei nic?

SELECT * FROM Products
WHERE Price > ALL (SELECT Price FROM Products WHERE Price > 40);

0

Czy nie powinno być tak, że mają być wyświetlone wszystkie kolumny, dla których Price jest większe od 40. Wszystkie, bo jest All.

1

ALL:
Result Value
Returns TRUE when the comparison specified is TRUE for** all pairs** (scalar_expression,x), when x is a value in the single-column set. Otherwise returns FALSE.
SOME | ANY:
SOME or ANY returns TRUE when the comparison specified is TRUE for **any pair **(scalar_expression,x) where x is a value in the single-column set; otherwise, returns FALSE.

Nawet przykład jest:

CREATE TABLE T1  
(ID INT) ;  
GO  
INSERT T1 VALUES (1) ;  
INSERT T1 VALUES (2) ;  
INSERT T1 VALUES (3) ;  
INSERT T1 VALUES (4) ; 

The following query returns TRUE because 3 is less than some of the values in the table.

IF 3 < SOME (SELECT ID FROM T1)  
PRINT 'TRUE'   
ELSE  
PRINT 'FALSE' ;  

The following query returns FALSE because 3 isn't less than all of the values in the table.

IF 3 < ALL (SELECT ID FROM T1)  
PRINT 'TRUE'   
ELSE  
PRINT 'FALSE' ;  
1

W uproszczeniu:

zapis:

SELECT * FROM Products
WHERE Price > ALL (SELECT Price FROM Products WHERE Price > 40);

warunek słownie brzmi tak, wybierz te rekordy, których wartość pola price jest większa od WSZYSTKICH wartości zwracanych przez podzapytanie.

Uprośćmy zapytanie powiedzmy, że masz 3 rekordy z warotściami price 30,41,50, czyli powyższe zapytanie mozna zapisać tak:

select * from products
where
   price > 41
   and price > 50

To powiedz mi która z tych 3 wartości spełni powyższy warunek?

Reasumując: wartość price musi być większa od wszystkich wartości

0

@Panczo: @woolfik dziękuję wam bardzo;-) Już rozumiem;-)

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