Как добавить данные в таблицу A из таблицы B, но только если в таблице C есть записи - PullRequest
0 голосов
/ 02 июля 2019

Я надеялся, что вы скажете мне, что я делаю здесь неправильно. У меня есть следующий отрывок из моей функции Postgres: Часть, в которую я вхожу в "RawdataCsvs2, не работает правильно.

Я хочу вставить записи только в StationMactemp и RawdataCsvs2, если место помечено как «Новое» в поле «CalcType» таблицы «Места».

Когда я запускаю сценарий в местах, которые не помечены как «Новые» в поле «CalcType», я не получаю записей в таблице .StationMacTemp (что идеально и чего я ожидал), но по какой-то причине я получаю записи добавлены в таблицу RawdataCsv2, хотя я также пытался использовать предложение where

where "StationMacTemp"."CalcType" = 'New' 
   and "csv_file"."StationMac" in (Select "StationMac" 
                                   from dbo."StationMacTemp");

Я подумал, что если я введу критерии, согласно которым StationMac должен быть найден в таблице StationMacTemp, то, если в этой таблице нет записей, тогда никакие записи не должны добавляться в таблицу RawDataCsvs2, но они все еще есть, а я нет знаю, почему. Любая помощь будет принята с благодарностью.

Я надеялся, что смогу использовать оператор If в своей функции или, может быть, Case When, и это ограничит выполнение этого скрипта только тогда, когда место в таблице мест обозначено как «Новое» в поле «CalcType».

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

...
DROP TABLE IF EXISTS dbo."StationMacTemp";
create table dbo."StationMacTemp" as 
select "StationMac","RawDataCsvs"."VenueId", "Venues"."CalcType", "AreaOfInterestId" 
from dbo."RawDataCsvs" 
   INNER JOIN dbo."Venues" ON ("Venues"."Id"= "RawDataCsvs"."VenueId")
   inner join dbo."AreaOfInterests" on ("AreaOfInterests"."Id"= "RawDataCsvs"."AreaOfInterestId")
where "Venues"."Id" = venueid 
  and "Venues"."CalcType" ='New' 
  and ("Venues"."VenueType" = 'RestoBar' OR "AreaOfInterests"."Level" = 77)  
group by dbo."RawDataCsvs"."StationMac", "RawDataCsvs"."VenueId", "Venues"."CalcType", dbo."RawDataCsvs"."AreaOfInterestId"; 


INSERT INTO dbo."RawDataCsvs2"("TimeStr", "StationMac", "Level", "Lat", "Lng", "RssMacStation1", 
        "RssStation1", "RssMacStation2", "RssStation2", "RssMacStation3", 
        "RssStation3", "RssMacStation4", "RssStation4", "RssMacStation5", 
        "RssStation5", "RssMacStation6", "RssStation6", "RssMacStation7", 
        "RssStation7", "RssMacStation8", "RssStation8", "RssMacStation9", 
        "RssStation9", "RssMacStation10", "RssStation10", "LoadingGuid", 
        "LoadingDate",
        "SiteId", 
        "VenueId", 
        "LocalTime", "OperatingDay", "AreaOfInterestId")
SELECT "TimeStr", csv_file."StationMac", csv_file."Level", "Lat", "Lng", "RssMacStation1", 
       "RssStation1", "RssMacStation2", "RssStation2", "RssMacStation3", 
           "RssStation3", "RssMacStation4", "RssStation4", "RssMacStation5", 
           "RssStation5", "RssMacStation6", "RssStation6", "RssMacStation7", 
           "RssStation7", "RssMacStation8", "RssStation8", "RssMacStation9", 
           "RssStation9", "RssMacStation10", "RssStation10", "LoadingGuid", 
           "LoadingDate",
        dbo.csv_file."SiteId", 
        csv_file."VenueId", 
        "LocalTime", "OperatingDay", dbo."StationMacTemp"."AreaOfInterestId" as "AreaOfInterestId"
FROM dbo.csv_file
    INNER JOIN dbo."Venues" ON ("Venues"."Id"= csv_file."VenueId")
    INNER JOIN dbo."StationMacTemp" on ("StationMacTemp"."StationMac" = csv_file."StationMac")
    INNER JOIN dbo."AreaOfInterests" on ("AreaOfInterests"."Id"= "StationMacTemp"."AreaOfInterestId")
where "Venues"."Id" = venueid 
  and "Venues"."CalcType" ='New' 
  and ("Venues"."VenueType" = 'RestoBar' OR "AreaOfInterests"."Level" = 77); 

Я ожидаю, что если место будет помечено как «Новое» в таблице мест, то будут заполнены таблицы StationMacTemp и RawDataCsvs2, и если место не помечено как «Новое», обе таблицы не будут заполнены. Я не получаю никаких сообщений об ошибках. Я просто всегда заполняю таблицу RawDataCsvs2 независимо от того, является ли место «Новым» или нет

...