Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

sql sélectionne un champ en 2 colonnes

Il doit exister une relation entre clé primaire et clé étrangère pour les données JOIN entre deux tables.

C'est l'idée de l'algèbre relationnelle et de la normalisation. Sinon, la corrélation des données n'a aucun sens.

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

Le CROSS JOIN vous donnera toutes les possibilités. (1,4), (1,5), (1, 6) ... (3,6). Je ne pense pas que ce soit ce que vous vouliez.

Vous pouvez toujours utiliser une fonction ROW_NUMBER() OVER() pour générer une clé de substitution dans les deux tables. Ordonnez les données comme vous le souhaitez dans la clause OVER(). Cependant, ce n'est toujours pas sous une forme normale.

En bref. Pourquoi faire ça ?

Base de données de test rapide. Stocke des produits d'articles de sport et d'articles pour la maison en utilisant une forme non normale.

Les résultats du SELECT ne veulent rien dire.

-- 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

Nous avons certainement besoin de plus d'informations de la part de l'utilisateur.