如何从 table 中获取与另一个 table 中所有值匹配的记录
How to fetch records from a table that matches with all values in the other table
如何编写一个查询来获取所有驾驶所有可用公交车的司机?
TABLE 总线
--------
BUS_ID
--------
1
2
3
4
TABLE DRIVER
-----------------------
BUS_ID | DRIVER_NAME
-----------------------
1 | John
2 | John
1 | Max
2 | Max
3 | Max
4 | Max
2 | Bill
3 | Ron
4 | Ron
1 | Ron
2 | Ron
在这个例子中它应该 return
DRIVER_NAME
-----------
Max
Ron
注意:不要在查询中对任何值进行硬编码。
下面是我写的
SELECT DRIVER.DRIVER_NAME
FROM DRIVER
WHERE BUS_ID = ALL( SELECT BUS_ID FROM BUS);
加入表格,按d.driver_name分组并将条件放在having子句中:
select
d.driver_name
from bus b inner join driver d
on d.bus_id = b.bus_id
group by d.driver_name
having count(*) = (select count(*) from bus)
将 grouping
与 having
子句一起使用:
SELECT D.DRIVER_NAME
FROM DRIVER D
GROUP BY D.DRIVER_NAME
HAVING COUNT(*) = (SELECT COUNT(*) FROM BUS);
DRIVER_NAME
-----------
Ron
Max
试试这个:
SELECT DISTINCT DRIVER_NAME FROM
(SELECT D.DRIVER_NAME,
COUNT(DISTINCT BUS_ID) OVER (PARTITION BY D.DRIVER_NAME) INDVDL,
COUNT(DISTINCT BUS_ID) OVER () TOTAL
FROM DRIVER D)
WHERE INDVDL = TOTAL
-- 更新--
SELECT DISTINCT
DRIVER_NAME
FROM
(
SELECT
D.DRIVER_NAME,
COUNT(DISTINCT BUS_ID) OVER(
PARTITION BY D.DRIVER_NAME
) INDVDL,
B.TOTAL AS TOTAL
FROM
DRIVER D JOIN
(
SELECT
COUNT(1) AS TOTAL
FROM
BUS
) B ON (1=1)
)
WHERE
INDVDL = TOTAL;
干杯!!
如何编写一个查询来获取所有驾驶所有可用公交车的司机?
TABLE 总线
--------
BUS_ID
--------
1
2
3
4
TABLE DRIVER
-----------------------
BUS_ID | DRIVER_NAME
-----------------------
1 | John
2 | John
1 | Max
2 | Max
3 | Max
4 | Max
2 | Bill
3 | Ron
4 | Ron
1 | Ron
2 | Ron
在这个例子中它应该 return
DRIVER_NAME
-----------
Max
Ron
注意:不要在查询中对任何值进行硬编码。
下面是我写的
SELECT DRIVER.DRIVER_NAME
FROM DRIVER
WHERE BUS_ID = ALL( SELECT BUS_ID FROM BUS);
加入表格,按d.driver_name分组并将条件放在having子句中:
select
d.driver_name
from bus b inner join driver d
on d.bus_id = b.bus_id
group by d.driver_name
having count(*) = (select count(*) from bus)
将 grouping
与 having
子句一起使用:
SELECT D.DRIVER_NAME
FROM DRIVER D
GROUP BY D.DRIVER_NAME
HAVING COUNT(*) = (SELECT COUNT(*) FROM BUS);
DRIVER_NAME
-----------
Ron
Max
试试这个:
SELECT DISTINCT DRIVER_NAME FROM
(SELECT D.DRIVER_NAME,
COUNT(DISTINCT BUS_ID) OVER (PARTITION BY D.DRIVER_NAME) INDVDL,
COUNT(DISTINCT BUS_ID) OVER () TOTAL
FROM DRIVER D)
WHERE INDVDL = TOTAL
-- 更新--
SELECT DISTINCT
DRIVER_NAME
FROM
(
SELECT
D.DRIVER_NAME,
COUNT(DISTINCT BUS_ID) OVER(
PARTITION BY D.DRIVER_NAME
) INDVDL,
B.TOTAL AS TOTAL
FROM
DRIVER D JOIN
(
SELECT
COUNT(1) AS TOTAL
FROM
BUS
) B ON (1=1)
)
WHERE
INDVDL = TOTAL;
干杯!!