2015-02-18 1 views
-2

Обязательно ли для таблиц быть применимыми к Присоединение к ним? Если да, то выполните с примером Если нет, то выполните анализ с примером .. СпасибоОбязательно ли для таблиц быть применимыми к Присоединению к ним?

+0

В логическом смысле да, потому что тогда результат не имеет никакого смысла, если вы просто присоединитесь к двум вещам, которые не имеют ничего общего друг с другом, но нет требования иметь внешние ключи или что-то подобное для присоединения , –

+0

Не проще попробовать, чем задать вопрос? Ну ... для этого вопроса наверное нет ... –

ответ

0

Совсем нет для sql-Server. Таблицы не нуждаются в привязке к ключам, чтобы они соединялись друг с другом.

Вот пример:

SELECT * FROM 
Table1 INNER JOIN Table2 ON Table1.Id = Table2.Id 

колонок Id table1 не нуждается быть ключом к колонку ид TABLE2 для этого к выполненным.

0

В MS SQL Server? Нет, таблицы не должны иметь никакого формального отношения для использования в любом типе соединения.

Поскольку вы просите пример, рассмотрите таблицу Numbers или Tally. Это в основном таблица с одним столбцом, который имеет все большее число, поскольку это значение. (То есть первая строка 1, вторая строка 2, и т.д.) Это полезно для большого количества вычислений, в том числе дата генерации диапазонов, таких как все дни кто едет:

-- Assume a table "Numbers exists with one column, "num": 
CREATE TABLE [dbo].[Numbers](
    [Num] [int] IDENTITY(1,1) NOT NULL, 
CONSTRAINT [PK_Numbers] PRIMARY KEY CLUSTERED 
(
    [Num] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

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

if OBJECT_ID('tempdb..#source') is not null drop table #source 
go 

create table #source(
    id int, 
    startdate date, 
    enddate date 
) 
go 

insert into #source values (1, '2013-12-28', '2014-01-12') 
insert into #source values (1, '2014-01-10', '2014-01-22') 
insert into #source values (2, '2014-12-22', null) 
insert into #source values (2, '2014-12-01', '2015-01-10') 
go 
-- */ 

declare @earlydate date, @latedate date 

-- Start and end dates of the range we're trying to evaluate within 
set @earlydate = '2014-01-01' 
set @latedate = '2014-12-31' 

;with fixed as (
    select 
     id, 
     (select max (start_date) from (values (#source.startdate), (@earlydate)) as sd(start_date)) as startdate, -- calculate the LATER of the start dates 
     (select min (end_date) from (values (coalesce(enddate, cast(CURRENT_TIMESTAMP as date))), (@latedate)) as ed(end_date)) as enddate -- calculate the EARLIER of the end dates 
    from #source 
) 
select 
    id, 
    DateAdd(dd, num-1, startdate) 
from fixed 
cross apply Numbers 
where DateAdd(dd, num, startdate) between startdate and dateadd(dd, 1, enddate) 
order by 1,2 
0

Нет, это не является обязательным для двух таблиц, чтобы быть в отношениях, чтобы применить присоединиться на них.

Когда вы думаете о слове «Присоединиться» в своем уме, вы на самом деле приближаете две вещи ближе к какой-то общей земле, слою, интерфейсу и т. Д. Поэтому, если ваши две таблицы имеют значение общей строки, вы можете это общее значения/значения для объединения этих двух таблиц. Итак, скажем, у вас есть таблица A, B. A имеют три (или ничего) столбца a1, a2, a3. Аналогично, B имеет 5 (или что-либо) количество столбцов. Если любой из столбцов в A имеет такое же значение, как любой столбец в B в любой строке, вы можете использовать это общее значение для соединения. Пример: выберите название столбца из левого соединения (или внешнего или внутреннего) B на A.column = B.column

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

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