Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak napisać prostą kwerendę wybierającą zamiast używać widoków?

Potrzebujesz HAVING klauzula, aby znaleźć COUNT(*) = 2 po pogrupowaniu według daty i specjalności. W rzeczywistości żadne zagnieżdżanie nie powinno być nawet konieczne. (Zamieniłem również twoje niejawne sprzężenie na oddzielone przecinkami FROM klauzula z jawnym JOIN , która jest bardziej preferowaną współczesną składnią).

SELECT 
  v.pid,
  d.speciality,
  v.date,
  COUNT(COUNT DISTINCT d.did) AS numvisits
FROM 
  visits v
  JOIN Doctors d ON v.did = d.did
GROUP BY v.pid, d.speciality, v.date
HAVING COUNT(COUNT DISTINCT d.did) = 2
/* Note - depending on your RDBMS, you may
   be able to use the count alias as
HAVING numvisits = 2 
   MySQL allows this, for ex, but MS SQL Server doesn't and I think Oracle doesn't */

SELECT lista tutaj i GROUP BY należy podać identyfikator pacjenta, specjalizację, datę i liczbę wizyt dla łącznej kombinacji tych 3 kolumn. HAVING klauzula następnie ogranicza ją tylko do tych, którzy odwiedzili grupę 2 razy.

Aby ciągnąć tylko pacjentów z tego, zapakuj to w podzapytanie:

SELECT Patients.* 
FROM Patients JOIN (
  SELECT 
    v.pid,
    d.speciality,
    v.date,
    COUNT(COUNT DISTINCT d.did) AS numvisits
  FROM 
    visits v
    JOIN Doctors d ON v.did = d.did
  GROUP BY v.pid, d.speciality, v.date
  HAVING COUNT(COUNT DISTINCT d.did) = 2
) subq ON Patients.pid = subq.pid


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wydajny sposób na aktualizację/zapełnienie bazy mysql zewnętrznym XML

  2. MySQL's now() +1 dzień

  3. Funkcja kanoniczna EntityFunctions.TruncateTime nie istnieje w MYSQL

  4. W tym wywołania funkcji DB w Pythonie MySQLdb executemany()

  5. Najlepsza struktura relacyjnej bazy danych z artykułami i tagami