Kiezen uit meerdere tafels zonder een join?

Wat is de gemakkelijkste manier om gegevens uit twee tabellen te selecteren en ze in plaats van ze samen te voegen, als afzonderlijke rijen te laten verschijnen. Beide tabellen hebben vergelijkbare of overeenkomende velden en ik wil er een statistische functie op uitvoeren, zoals het gemiddelde van alle rijen die zich in dezelfde maand hebben voorgedaan, van beide tabellen.

Ik heb bijvoorbeeld twee tabellen, een met transacties van het ene systeem en een andere met transacties van een ander systeem. Is er een manier om alle transacties van beide tabellen als afzonderlijke rijen te pakken? als tabel 1 twintig records heeft en tabel 2 dertig records, dan zou ik graag 50 rijen op de return willen hebben.


Antwoord 1, autoriteit 100%

Je zou zoiets als dit kunnen proberen:

SELECT ...
FROM (
    SELECT f1,f2,f3 FROM table1
    UNION
    SELECT f1,f2,f3 FROM table2
)
WHERE ...

Antwoord 2, autoriteit 64%

De operator UNION ALLis misschien wat u zoekt.

Met deze operator kunt u de resultatensets van meerdere query’s samenvoegen, waarbij alle rijen van elke query behouden blijven. Merk op dat een operator UNION(zonder het trefwoord ALL) alle “dubbele” rijen in de resultatenset zal verwijderen. De operator UNION ALLbewaart alle rijen van elke query (en zal waarschijnlijk beter presteren omdat het niet de overhead heeft van het uitvoeren van de duplicaatcontrole en verwijderingsbewerking).

Het aantal kolommen en het gegevenstype van elke kolom moet overeenkomen in elk van de query’s. Als een van de query’s meer kolommen heeft dan de andere, nemen we soms dummy-expressies op in de andere query om ervoor te zorgen dat de kolommen en gegevenstypen “overeenkomen”. Vaak is het handig om een expressie (een extra kolom) op te nemen in de SELECT-lijst van elke query die een letterlijke waarde retourneert, om te zien welke van de query’s de “bron” van de rij was.

SELECT 'q1' AS source, a, b, c, d FROM t1 WHERE ...
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 JOIN t3 ON ...
UNION ALL
SELECT 'q3', '1', '2', buckle, my_shoe FROM t4

Je kunt een query als deze tussen haakjes plaatsen en deze gebruiken als een inline-weergave (of “afgeleide tabel”, in MySQL-jargon), zodat je aggregatiebewerkingen op alle rijen kunt uitvoeren.

p>

SELECT t.a
     , SUM(t.b)
     , AVG(t.c)
  FROM (
         SELECT 'q1' AS source, a, b, c, d FROM t1
          UNION ALL
         SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
       ) t
 GROUP BY t.a
 ORDER BY t.a

Antwoord 3, autoriteit 54%

Je zou deze notatie kunnen proberen:

SELECT * from table1,table2 

Meer gecompliceerde:

SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse

Antwoord 4, autoriteit 16%

Als je vraag dit was — Selecteer ename, dname FROM emp, dept zonder joins te gebruiken..

Dan zou ik dit doen…

SELECT ename, (SELECT dname 
FROM dept
WHERE dept.deptno=emp.deptno)dname
FROM EMP

Uitvoer:

ENAME      DNAME
---------- --------------
SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH
ENAME      DNAME
---------- --------------
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING
14 rows selected.

Antwoord 5, autoriteit 9%

Je zou dit eens moeten proberen

SELECT t1.*,t2.* FROM t1,t2

Antwoord 6

Union haalt gegevens op per rij en niet per kolom, dus als u net als ik zoekt naar het ophalen van kolomgegevens uit twee verschillende tabellen zonder relatie en zonder join.
In mijn geval haal ik de naam van de staat en het land op met id. In plaats van twee query’s te schrijven, kunt u dit op deze manier doen.

select 
   (
   select s.state_name from state s where s.state_id=3
   ) statename,
   (
   select c.description from country c where c.id=5
   ) countryname
   from dual;   

waarbij dual een dummy-tabel is met een enkele kolom – alles heeft alleen een tabel nodig om te bekijken


Antwoord 7

selecteer ‘test’, (selecteer naam van werknemer waar id=1) als naam, (selecteer naam van adres waar id=2) als adres ;


Antwoord 8

In dit geval gaan we ervan uit dat we twee tabellen hebben:
SMPPMsgLogen SMSServicemet gemeenschappelijke kolom serviceid:

SELECT sp.SMS,ss.CMD 
FROM vas.SMPPMsgLog AS sp,vas.SMSService AS ss 
WHERE sp.serviceid=5431 
AND ss.ServiceID = 5431 
AND Receiver ="232700000" 
AND date(TimeStamp) <='2013-08-07' 
AND date(TimeStamp) >='2013-08-06' \G;

Other episodes