Можно всегда добавлять"!" в Ваши опции плавающие. Таким образом, латекс пытается действительно трудно разместить число, где Вы хотите его (я главным образом использую [h! ТБ]), расширяя нормальные правила набора.
я нашел другое решение:
Использование плавание - пакет. Таким образом, можно разместить числа, где Вы хотите, чтобы они были.
Если таблица людей:
id name
1 Person One
2 Person Two
3 Person Three
4 Person Four
5 Person Five
Если таблица менеджеров равна
id name
-1 Admin
2 Manager One
3 Manager Two
, если запрос:
SELECT DISTINCT *
FROM Person LEFT JOIN Manager
ON (Manager.id = Person.id OR Manager.id = -1)
Тогда результат:
Person One -1 Admin
Person Two -1 Admin
Person Two 2 Manager One
Person Three -1 Admin
Person Three 3 Manager Two
Person Four -1 Admin
Person Five -1 Admin
Здесь все строки людей объединяются с -1 Администратор (в таблице диспетчера) И если такой же идентификатор существует в таблице диспетчера, происходит еще одно соединение.
Если в таблице диспетчера нет строки, где идентификатор равен -1, она вообще ничего не делает. Если такая строка есть, то она всегда будет присоединяться к каждой строке в таблице людей. Таким образом, для каждой строки Person вы потенциально можете получить две ros в выводе запроса, одну с manager.id = id человека, а другую со строкой Manager.ID = -1
Также вы увидите предложение AND, используемое для дальнейшей фильтрации записей. Это чрезвычайно важно при работе с внешними соединениями, поскольку добавление этих действий фильтрации к предложению where превратит соединение из левого соединения во внутреннее соединение (если только это не что-то вроде, где t.idfield имеет значение null).
Ниже я показываю как это работает и почему важно поместить предложения фильтрации в нужное место.
создать таблицу #test (test1id int, test varchar (10)) создать таблицу # test2 (test2id int, test1id int, test2 varchar (10))
insert into #test (test1id, test)
select 1, 'Judy'
union all
select 2, 'Sam'
union all
select 3, 'Nathan'
insert into #test2 (test2id, test1id, test2)
select 1,1,'hello'
union all
select 2,1,'goodbye'
union all
select 3,2,'hello'
select * from #test t
left join #test2 t2 on t.test1id = t2.test1id
where test2 = 'goodbye'
--result set
--test1id test test2id test1id test2
--1 Judy 2 1 goodbye
select * from #test t
left join #test2 t2 on t.test1id = t2.test1id
and test2 = 'goodbye'
--result set
--test1id test test2id test1id test2
--1 Judy 2 1 goodbye
--2 Sam NULL NULL NULL
--3 Nathan NULL NULL NULL
Вы можете использовать, где какое-то поле имеет значение NULL (при условии, что вы выбираете поле, которое никогда не будет нулевым), чтобы захватить записи в первой таблице, но не второй такой:
select * from #test t
left join #test2 t2 on t.test1id = t2.test1id
where test2id is null
--result set
--test1id test test2id test1id test2
--3 Nathan NULL NULL NULL