2016-05-06 4 views
2

Я пишу код SQL, который будет запущен в MapBasic (язык программирования MapInfo). Лучший способ описать вопрос: Пример:SQL - Разделить поток данных запроса на две отдельные таблицы [Теоретическая оптимизация]

Я хочу выбрать все записи, где ShipType = «Barge» в запрос с именем Barges, и я хочу, чтобы все остальные записи были помещены в запрос OtherShips.

я мог бы просто использовать следующие SQL команды:

select * from ShipsTable where ShipType = "Barge" into Barges 
select * from ShipsTable where ShipType <> "Barge" into OtherShips 

Это хорошо и все, но я не могу помочь, но чувствую, что это неэффективно. Не будет ли SQL дважды искать базу данных? Не найдут ли строки данных, которые соответствуют второму запросу во время обработки 1-го?

Вместо этого, было бы быстрее, если бы там была команда, как:

select * from ShipsTable where ShipType = "Barge" into Barges ELSE into OtherShips 

Мой вопрос, вы можете это сделать? Есть ли команда, которая соответствует этой спецификации?

Спасибо,

ответ

0

MapBasic действительно обеспечивает доступ к MapInfo в «Invert Selection», который дал бы вам что-нибудь, что не был выбран из первого запроса (если ваш первый запрос действительно возвращают результаты). Вы можете вызвать его, используя его идентификатор меню (найденный в Menu.def), который равен 311, или если вы включили menu.def в начало файла, вы можете ссылаться на него через константу M_QUERY_INVERTSELECT.

например.

Select * from ShipsTable where ShipType = "Barge" into Barges 
Run Menu Command 311 

или Run Menu Command M_QUERY_INVERTSELECT, если вы включили файл определений меню.

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

+0

А, аналогичный ответ Уффе на группу MapInfo-L еще не видел этого. Во всяком случае, похоже, что вы провели какое-то тестирование, и это немного повышает производительность, делая это таким образом. –

+0

Ха-ха спасибо за ответ независимо! :) – Sancarn

1

Вы можете сделать это довольно легко в SSIS с условным расколом и двумя различных направлениями.

Но не в TSQL.

Однако для «забавы» некоторые возможности рассмотрены ниже.

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

CREATE TABLE Barges 
(
Id INT, 
ShipType VARCHAR(50) NOT NULL CHECK (ShipType = 'Barge'), 
PRIMARY KEY (Id, ShipType) 
) 

CREATE TABLE OtherShips 
(
Id INT, 
ShipType VARCHAR(50) NOT NULL CHECK (ShipType <> 'Barge'), 
PRIMARY KEY (Id, ShipType) 
) 

CREATE TABLE ShipsTable 
(
ShipType VARCHAR(50) NOT NULL 
) 

go 

CREATE VIEW ShipsView 
AS 
SELECT * 
FROM Barges 
UNION ALL 
SELECT * 
FROM OtherShips 

GO 

INSERT INTO ShipsView(Id, ShipType) 
SELECT ROW_NUMBER() OVER(ORDER BY @@SPID), ShipType 
FROM ShipsTable 

enter image description here

Или вы могли бы использовать предложение OUTPUT и наборный DML, но это потребует вставить оба набора строк в первой таблице, а затем вычищать ненужные строки после (вторая таблица будет получить только правильные строки и не нуждаются в какой-либо очистке).

CREATE TABLE Barges2 
(
ShipType VARCHAR(50) NOT NULL 
) 

CREATE TABLE OtherShips2 
(
ShipType VARCHAR(50) NOT NULL 
) 

CREATE TABLE ShipsTable2 
(
ShipType VARCHAR(50) NOT NULL 
) 

INSERT INTO Barges2 
SELECT * 
FROM 
(
INSERT INTO OtherShips2 
OUTPUT INSERTED.* 
SELECT * 
FROM ShipsTable2 
) D 
WHERE D.ShipType = 'Barge'; 

DELETE FROM OtherShips2 WHERE ShipType = 'Barge'; 

enter image description here

+0

Ничего себе, я никогда не знал, что вы можете сделать любую из этих вещей ...: O А также эти блок-схемы являются эпическими! : D Так как я только сделал SQL в MapBasic, я никогда не видел таких вещей. Спасибо за идеи! Идея 2 выглядит для меня более понятной: P – Sancarn

 Смежные вопросы

  • Нет связанных вопросов^_^