简体   繁体   中英

Pairwise Subquery Not Working As Expected

I have three tables, highschooler, friend, and likes. The data for these tables looks like this:

Highschooler
ID  name    grade
1510    Jordan  9
1689    Gabriel 9
1381    Tiffany 9
1709    Cassandra   9
1101    Haley   10
1782    Andrew  10
1468    Kris    10
1641    Brittany    10
1247    Alexis  11
1316    Austin  11
1911    Gabriel 11
1501    Jessica 11
1304    Jordan  12
1025    John    12
1934    Kyle    12
1661    Logan   12

Friend
ID1 ID2
1510    1381
1510    1689
1689    1709
1381    1247
1709    1247
1689    1782
1782    1468
1782    1316
1782    1304
1468    1101
1468    1641
1101    1641
1247    1911
1247    1501
1911    1501
1501    1934
1316    1934
1934    1304
1304    1661
1661    1025
1381    1510
1689    1510
1709    1689
1247    1381
1247    1709
1782    1689
1468    1782
1316    1782
1304    1782
1101    1468
1641    1468
1641    1101
1911    1247
1501    1247
1501    1911
1934    1501
1934    1316
1304    1934
1661    1304
1025    1661

Likes
ID1 ID2
1689    1709
1709    1689
1782    1709
1911    1247
1247    1468
1641    1468
1316    1304
1501    1934
1934    1501
1025    1101

I execute the following query which utilizes a pairwise subquery:

select a.name, b.name
from highschooler a join highschooler b
on a.id< b.id
where (a.id, b.id) in (
select id1, id2
from likes);

This query returns this information:

NAME                      NAME
------------------------- -------------------------
Gabriel                   Cassandra
John                      Haley
Alexis                    Kris
Jessica                   Kyle

I execute another query:

select a.name, b.name
from highschooler a join highschooler b
on a.id<b.id
where (a.id, b.id) in (
select id2, id1
from likes);

Which returns the following information:

NAME                      NAME
------------------------- -------------------------
Gabriel                   Cassandra
Cassandra                 Andrew
Kris                      Brittany
Jordan                    Austin
Alexis                    Gabriel
Jessica                   Kyle

This works as expected, but the following query results in an oddity:

SQL> select a.name, b.name
  2  from highschooler a join highschooler b
  3  on a.id < b.id
  4  where (a.id, b.id) in (
  5  select id1, id2
  6  from likes)
  7  and (a.id, b.id) in (
  8  select id2, id1
  9  from likes);

NAME                      NAME
------------------------- -------------------------
Gabriel                   Cassandra
John                      Haley
Alexis                    Kris
Jessica                   Kyle

This query should, in theory, just return the pairs of Gabriel-Cassandra and Jessica-Kyle. Why doesn't it return this result?

It does return only those two pairs.

with Highschooler (id, name) as (
SELECT 1510,    'Jordan'  FROM DUAL UNION ALL
SELECT 1689,    'Gabriel' FROM DUAL UNION ALL
SELECT 1381,    'Tiffany' FROM DUAL UNION ALL
SELECT 1709,    'Cassandra'   FROM DUAL UNION ALL
SELECT 1101,    'Haley'   FROM DUAL UNION ALL
SELECT 1782,    'Andrew'  FROM DUAL UNION ALL
SELECT 1468,    'Kris'    FROM DUAL UNION ALL
SELECT 1641,    'Brittany' FROM DUAL UNION ALL
SELECT 1247,    'Alexis'  FROM DUAL UNION ALL
SELECT 1316,    'Austin'  FROM DUAL UNION ALL
SELECT 1911,    'Gabriel' FROM DUAL UNION ALL
SELECT 1501,    'Jessica' FROM DUAL UNION ALL
SELECT 1304,    'Jordan'  FROM DUAL UNION ALL
SELECT 1025,    'John'    FROM DUAL UNION ALL
SELECT 1934,    'Kyle'    FROM DUAL UNION ALL
SELECT 1661,    'Logan'   FROM DUAL ),
Likes ( id1, id2 ) AS (
SELECT 1689,    1709 FROM DUAL UNION ALL
SELECT 1709,    1689  FROM DUAL UNION ALL
SELECT 1782,    1709  FROM DUAL UNION ALL
SELECT 1911,    1247 FROM DUAL UNION ALL
SELECT 1247,    1468 FROM DUAL UNION ALL
SELECT 1641,    1468 FROM DUAL UNION ALL
SELECT 1316,    1304 FROM DUAL UNION ALL
SELECT 1501,    1934 FROM DUAL UNION ALL
SELECT 1934,    1501 FROM DUAL UNION ALL
SELECT 1025,    1101 FROM DUAL)
SELECT
    a.name,
    b.name
FROM
    highschooler a
    JOIN highschooler b
    ON a.id < b.id
WHERE
    ( a.id,
    b.id ) IN (
        SELECT
            id1,
            id2
        FROM
            likes
    )
    AND   ( a.id,
    b.id ) IN (
        SELECT
            id2,
            id1
        FROM
            likes
    );

Results:

+---------+-----------+
|  NAME   |  NAME_1   |
+---------+-----------+
| Gabriel | Cassandra |
| Jessica | Kyle      |
+---------+-----------+

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM