/ / Próba wykonania operacji MINUS w MySQL - mysql

Próba wykonania operacji MINUS w MySQL - mysql

Próbuję wykonać MINUS operacja w MySql.Mam trzy tabele:

  1. jeden ze szczegółami usługi
  2. jedna tabela ze stanami, w których usługa jest oferowana
  3. kolejna tabela (na podstawie kodu pocztowego i stanu) pokazuje, gdzie ta usługa nie jest oferowana.

Mogę osobno uzyskać dane wyjściowe dla tych dwóch wybranych zapytań. Ale potrzebuję połączonej instrukcji, która daje wynik jako „SELECT query_1 - SELECT query_2”.

Tabela szczegółów usługi Service_Code (PK) Nazwa usługi

Tabela stanu obsługi Service_Code (FK) State Country PK (Service_Code, State, Country)

Tabela wyjątków Kod_usługi (FK) Kod pocztowy Kod stanu (kod_usługi, kod pocztowy, stan)

Odpowiedzi:

9 dla odpowiedzi № 1

MySql nie rozpoznaje MINUS i KRZYŻOWAĆ, są to operacje oparte na Oracle. W MySql użytkownik może z niego korzystać NOT IN tak jak MINUS (są też inne rozwiązania, ale bardzo mi się podobało). Przykład:

select a.id
from table1 as a
where <condition>
AND a.id NOT IN (select b.id
from table2 as b
where <condition>);

5 dla odpowiedzi nr 2

MySQL Nie obsługuje MINUS lub Z WYJĄTKIEM, możesz użyć NOT EXISTS, NULL lub NOT IN.


1 dla odpowiedzi nr 3

Tabele muszą mieć te same kolumny, ale myślę, że możesz osiągnąć to, czego szukasz EXCEPT... oprócz tego EXCEPT działa tylko w standardowym SQL! Oto jak to zrobić w MySQL:

SELECT * FROM Servicing_states ss WHERE NOT EXISTS
( SELECT * FROM Exception e WHERE ss.Service_Code = e.Service_Code);

http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/

Standardowy SQL

SELECT * FROM Servicing_States
EXCEPT
SELECT * FROM Exception;

1 dla odpowiedzi nr 4

Typem przeciwstawnym jest typowe podejścieposługiwać się. To jest sprzężenie zewnętrzne, aby zwrócić wszystkie wiersze z zapytania_1, wraz z pasującymi wierszami z zapytania_2, a następnie odfiltrować wszystkie wiersze, które miały dopasowanie ... pozostawiając tylko wiersze z zapytania_1, które nie miały dopasowania. Na przykład:

   SELECT q1.*
FROM ( query_1 ) q1
LEFT
JOIN ( query_2 ) q2
ON q2.id = q1.id
WHERE q2.id IS NULL

Aby naśladować MINUS set operator, potrzebujemy predykatu łączenia, aby porównać wszystkie kolumny zwrócone przez q1 i q2, również pasujące do wartości NULL.

       ON q1.col1 <=> q2.col2
AND q1.col2 <=> q2.col2
AND q1.col3 <=> q2.col3
AND ...

Również, aby w pełni emulować MINUS Operacja, musimy także usunąć zduplikowane wiersze zwrócone przez q1. Dodanie DISTINCT wystarczyłoby to słowo kluczowe.


0 dla odpowiedzi № 5

Oto moje dwa centy ... złożone zapytanie właśnie sprawiło, że działało, pierwotnie wyrażone za pomocą Minus i przetłumaczone dla MySql

Z MINUS:

select distinct oi.`productOfferingId`,f.name
from t_m_prod_action_oitem_fld f
join t_m_prod_action_oitem oi
on f.fld2prod_action_oitem = oi.oid;
minus
select
distinct r.name,f.name
from t_m_prod_action_oitem_fld f
join t_m_prod_action_oitem oi
on f.fld2prod_action_oitem = oi.oid
join t_m_rfs r
on r.name = oi.productOfferingId
join t_m_attr a
on a.attr2rfs = r.oid and f.name = a.name;

Z NIE ISTNIEJE

select distinct oi.`productOfferingId`,f.name
from t_m_prod_action_oitem_fld f
join t_m_prod_action_oitem oi
on f.fld2prod_action_oitem = oi.oid
where not exists (
select
r.name,f.name
from t_m_rfs r
join t_m_attr a
on a.attr2rfs = r.oid
where r.name = oi.productOfferingId and f.name = a.name