Справка по вопросам интервью относительно относительно базовых JOIN и подзапросов - PullRequest
1 голос
/ 25 марта 2019

Меня попросили:

"Выведите следующую последовательность столбцов для каждого растения, которое цветет только в один тип погоды.

  1. WEATHER_TYPE
  2. PLANT_NAME "

Схема
РАСТЕНИЯ (название таблицы)
PLANT_NAME, строка, название завода. Это первичный ключ.
PLANT_SPECIES, жало, вид растения.
SEED_DATE, дата, дата посева семян.

ПОГОДА (название таблицы)
PLANT_SPECIES, строка, вид растения.
WEATHER_TYPE, string, тип погоды, в которой цветет растение.

Я написал скрипт ниже и проверил его на примере ввода и добился желаемого результата. Я не знаю, считается ли это «печатным» результатом.

В поисках понимания того, что я мог пропустить. Как я могу сделать этот скрипт «более эффективным» и / или «лучше» и / или «более надежным»?

SELECT WEATHER.WEATHER_TYPE, a.PLANT_NAME
FROM (SELECT b.PLANT_NAME, b.PLANT_SPECIES
      FROM (SELECT PLANTS.PLANT_NAME, PLANTS.PLANT_SPECIES, PLANTS.SEED_DATE, WEATHER.WEATHER_TYPE
            FROM PLANTS JOIN WEATHER 
            ON PLANTS.PLANT_SPECIES = WEATHER.PLANT_SPECIES) b
      GROUP BY b.PLANT_NAME, b.PLANT_SPECIES
      HAVING count(*) = 1) a JOIN WEATHER
ON a.PLANT_SPECIES = WEATHER.PLANT_SPECIES

Ожидаю следующий результат:

Пример вывода
Sunny Marchantia1
Sunny Marchantia2

Я достиг ожидаемого результата в окне SQL Server Management Studio, но не уверен, является ли это «напечатанным» результатом, который ищут вопросы.

Ответы [ 2 ]

3 голосов
/ 25 марта 2019

Лично я считаю, что CTE легче читать и отлаживать по сравнению с вложенными «табличными выражениями», как вы уже сделали. Я бы сделал что-то вроде:

with
x as (
  select p.plant_name
  from plants p
  join weather w on w.plant_species = p.plant_species
  group by p.plant_name
  having count(*) = 1
)
select x.plant_name, w.weather_type
from x
join weather w on w.plant_species = x.plant_species
0 голосов
/ 26 марта 2019

Я должен согласиться с Impaler в отношении читабельности и простоты отладки вложенных табличных выражений.В качестве другого варианта CTE (который действительно является лучшим выбором), если вы действительно хотите вкладывать вещи, не задумываясь, вы можете использовать коррелированный подзапрос.Его легче читать, хотя с ростом набора результатов вы теряете эффективность.

SELECT w.weather_type, p.plant_name 
FROM plants p
JOIN weather w 
    ON w.plant_species = p.plant_species
WHERE (SELECT COUNT(1) FROM dbo.weather WHERE plant_species = w.plant_species) = 1

или с группировкой ...

SELECT w.weather_type, p.plant_name 
FROM plants p
JOIN weather w 
    ON w.plant_species = p.plant_species
WHERE w.plant_species IN (SELECT plant_species FROM dbo.weather  GROUP BY plant_species HAVING COUNT(1) = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...