如何组合两个具有相同值但不相同 INNER JOIN 的选择

How to combine two selects with same value but not the same INNER JOIN

我需要一个项目学校,一个像 ebay 这样的网站 出价。
我必须做一个 select 谁 select

但问题是有两个值在同一个 table 中,所以为了访问该值,我需要使用不同的 INNER JOIN 创建 2 select(查看诊断以了解)

我制作了两个 select,但我不知道如何制作一个 select。

    SELECT nom AS nameSeller
    FROM ENCHERES e
    INNER JOIN  ARTICLES_VENDUS  ac ON ac.no_article = e.no_article 
    INNER JOIN UTILISATEURS u ON u.no_utilisateur = ac.no_utilisateur
    WHERE nom_article LIKE '%ta%'
    
    SELECT nom AS nameCustomer
    FROM ENCHERES e
    INNER JOIN UTILISATEURS u ON e.no_utilisateur = u.no_utilisateur
    WHERE e.no_utilisateur= 57

我有两个 select

第一个select

nameCustomer
john

第二个select

nameSeller
bryan

我想要的合一select

nameSeller nameCustomer
bryan john

填写脚本创建table和bdd

-- Script de création de la base de données ENCHERES
--   type :      SQL Server 2012
--

CREATE DATABASE BDDTEST2
GO
USE BDDTEST2
GO

CREATE TABLE CATEGORIES (
    no_categorie   INTEGER IDENTITY(1,1) NOT NULL,
    libelle        VARCHAR(30) NOT NULL
)

ALTER TABLE CATEGORIES ADD constraint categorie_pk PRIMARY KEY (no_categorie)

CREATE TABLE ENCHERES (
    no_utilisateur   INTEGER NOT NULL,
    no_article       INTEGER NOT NULL,
    date_enchere     datetime NOT NULL,
    montant_enchere  INTEGER NOT NULL

)

ALTER TABLE ENCHERES ADD constraint enchere_pk PRIMARY KEY (no_utilisateur, no_article)

CREATE TABLE RETRAITS (
    no_article         INTEGER NOT NULL,
    rue              VARCHAR(30) NOT NULL,
    code_postal      VARCHAR(15) NOT NULL,
    ville            VARCHAR(30) NOT NULL
)

ALTER TABLE RETRAITS ADD constraint retrait_pk PRIMARY KEY  (no_article)

CREATE TABLE UTILISATEURS (
    no_utilisateur   INTEGER IDENTITY(1,1) NOT NULL,
    pseudo           VARCHAR(30) NOT NULL,
    nom              VARCHAR(30) NOT NULL,
    prenom           VARCHAR(30) NOT NULL,
    email            VARCHAR(20) NOT NULL,
    telephone        VARCHAR(15),
    rue              VARCHAR(30) NOT NULL,
    code_postal      VARCHAR(10) NOT NULL,
    ville            VARCHAR(30) NOT NULL,
    mot_de_passe     VARCHAR(30) NOT NULL,
    credit           INTEGER NOT NULL,
    administrateur   bit NOT NULL
)

ALTER TABLE UTILISATEURS ADD constraint utilisateur_pk PRIMARY KEY (no_utilisateur)


CREATE TABLE ARTICLES_VENDUS (
    no_article                    INTEGER IDENTITY(1,1) NOT NULL,
    nom_article                   VARCHAR(30) NOT NULL,
    description                   VARCHAR(300) NOT NULL,
    date_debut_encheres           DATE NOT NULL,
    date_fin_encheres             DATE NOT NULL,
    prix_initial                  INTEGER,
    prix_vente                    INTEGER,
    no_utilisateur                INTEGER NOT NULL,
    no_categorie                  INTEGER NOT NULL
)

ALTER TABLE ARTICLES_VENDUS ADD constraint articles_vendus_pk PRIMARY KEY (no_article)

ALTER TABLE ARTICLES_VENDUS
    ADD CONSTRAINT encheres_utilisateur_fk FOREIGN KEY ( no_utilisateur ) 
    REFERENCES UTILISATEURS ( no_utilisateur )
ON DELETE NO ACTION 
    ON UPDATE no action 

ALTER TABLE ENCHERES
    ADD CONSTRAINT encheres_articles_vendus_fk FOREIGN KEY ( no_article )
        REFERENCES ARTICLES_VENDUS ( no_article )
ON DELETE NO ACTION 
    ON UPDATE no action 

ALTER TABLE RETRAITS
    ADD CONSTRAINT retraits_articles_vendus_fk FOREIGN KEY ( no_article )
        REFERENCES ARTICLES_VENDUS ( no_article )
ON DELETE NO ACTION 
    ON UPDATE no action 

ALTER TABLE ARTICLES_VENDUS
    ADD CONSTRAINT articles_vendus_categories_fk FOREIGN KEY ( no_categorie )
        REFERENCES CATEGORIES ( no_categorie )
ON DELETE NO ACTION 
    ON UPDATE no action 

ALTER TABLE ARTICLES_VENDUS
    ADD CONSTRAINT ventes_utilisateur_fk FOREIGN KEY ( no_utilisateur )
        REFERENCES UTILISATEURS ( no_utilisateur )
ON DELETE NO ACTION 
    ON UPDATE no action 


Link 插入值

USE BDDTEST2
GO

INSERT INTO [dbo].[UTILISATEURS]
           ([pseudo]
           ,[nom]
           ,[prenom]
           ,[email]
           ,[telephone]
           ,[rue]
           ,[code_postal]
           ,[ville]
           ,[mot_de_passe]
           ,[credit]
           ,[administrateur])
     VALUES
           ('zorg'
           ,'john'
           ,'john'
           ,'j@k.c'
           ,'15454'
           ,'hjh'
           ,'hkk'
           ,'hjgjh'
           ,'hjkjg'
           ,0
           ,0 )
GO

INSERT INTO [dbo].[UTILISATEURS]
           ([pseudo]
           ,[nom]
           ,[prenom]
           ,[email]
           ,[telephone]
           ,[rue]
           ,[code_postal]
           ,[ville]
           ,[mot_de_passe]
           ,[credit]
           ,[administrateur])
     VALUES
           ('zorg'
           ,'bryan'
           ,'bryan'
           ,'j@k.c'
           ,'15454'
           ,'hjh'
           ,'hkk'
           ,'hjgjh'
           ,'hjkjg'
           ,0
           ,0 )
GO

INSERT INTO [dbo].[CATEGORIES]
           ([libelle])
     VALUES
           ('enfant')
GO


INSERT INTO [dbo].[ARTICLES_VENDUS]
           ([nom_article]
           ,[description]
           ,[date_debut_encheres]
           ,[date_fin_encheres]
           ,[prix_initial]
           ,[prix_vente]
           ,[no_utilisateur]
           ,[no_categorie])
     VALUES
           ('Jouet',
           'desc',
           '2002-01-01',
           '2003-01-01',
           0,
           0,
           2,
           1)
GO


INSERT INTO [dbo].[ENCHERES]
           ([no_utilisateur]
           ,[no_article]
           ,[date_enchere]
           ,[montant_enchere])
     VALUES
           (1,
          1,
           '2002-02-02',
           50)
GO

谢谢

  • 潜在客户会将当前行移至上一位
  • 联合将在单列中连接数据
  • order by 子句
  • 你需要有一个共同因素,例如日期

https://www.mssqltips.com/sqlservertutorial/9127/sql-server-window-functions-lead-and-lag/

with main_data as (

    SELECT nom AS nameSeller,
    'Seller' as category_seller_or_customer
    FROM ENCHERES e
    INNER JOIN  ARTICLES_VENDUS  ac ON ac.no_article = e.no_article 
    INNER JOIN UTILISATEURS u ON u.no_utilisateur = ac.no_utilisateur
    WHERE nom_article LIKE '%ta%'

    union

    SELECT nom AS nameCustomer,
   'Customer' as category_seller_or_customer
    FROM ENCHERES e
    INNER JOIN UTILISATEURS u ON e.no_utilisateur = u.no_utilisateur
    WHERE e.no_utilisateur= 57
),
getting_seller_and_buyer AS (

select 
*,
 lead(category_seller_or_customer) 
 over(order by 
       [some date factor or something that both have in common]
     ) as current_seller_or_customer

from main_data
)

select 

*,
case 
when category = 'Seller' then current_seller_or_customer else end as seller,

case 
when category = 'Customer' then current_seller_or_customer else end as customer

from 

getting_seller_and_buyer

您可以使用CROSS APPLY 为每个卖家拉回买家。考虑以下因素:

 SELECT u.nom AS nameSeller, x.nom nameBuyer
    FROM ENCHERES e
    INNER JOIN  ARTICLES_VENDUS  ac ON ac.no_article = e.no_article 
    INNER JOIN UTILISATEURS u ON u.no_utilisateur = ac.no_utilisateur
CROSS APPLY(
        select u.nom 
        from  UTILISATEURS u WHERE  u.no_utilisateur = e.no_utilisateur
    ) X