sql >> Base de Datos >  >> RDS >> Sqlserver

sql selecciona un campo en 2 columnas

Tiene que haber una relación de clave principal a clave externa para UNIR datos entre dos tablas.

Esa es la idea sobre el álgebra relacional y la normalización. De lo contrario, la correlación de los datos no tiene sentido.

http://en.wikipedia.org/wiki/Database_normalization

El CROSS JOIN te dará todas las posibilidades. (1,4), (1,5), (1, 6)... (3,6). No creo que eso sea lo que quieres.

Siempre puede usar una función ROW_NUMBER() OVER() para generar una clave sustituta en ambas tablas. Ordene los datos de la manera que desee dentro de la cláusula OVER (). Sin embargo, esto todavía no está en ninguna forma Normal.

En resumen. ¿Por qué hacer esto?

Base de datos de prueba rápida. Almacena productos de artículos deportivos y artículos para el hogar utilizando una forma no normal.

Los resultados del SELECT no significan nada.

-- Just play
use tempdb;
go

-- Drop table
if object_id('abnormal_form') > 0
drop table abnormal_form
go

-- Create table
create table abnormal_form
(
    Id int,
    Category int,
    Name varchar(50)
);

-- Load store products
insert into abnormal_form values
(1, 1, 'Bike'),
(2, 1, 'Bat'),
(3, 1, 'Ball'),
(4, 2, 'Pot'),
(5, 2, 'Pan'),
(6, 2, 'Spoon');

-- Sporting Goods
select * from abnormal_form where Category = 1

-- Home Goods
select * from abnormal_form where Category = 2

-- Does not mean anything to me
select Id1, Id2 from
(select ROW_NUMBER () OVER (ORDER BY ID) AS Rid1, Id as Id1 
 from abnormal_form where Category = 1) as s
join
(select ROW_NUMBER () OVER (ORDER BY ID) AS Rid2, Id as Id2 
 from abnormal_form where Category = 2) as h
on s.Rid1 = h.Rid2

Definitivamente necesitamos más información del usuario.