Как объединить два выбора с одинаковым значением, но не с одним и тем же ВНУТРЕННИМ СОЕДИНЕНИЕМ

#sql #sql-server #tsql #select #inner-join

Вопрос:

Мне нужна проектная школа, сайт вроде ebay с предложением.
Я должен сделать выбор, кто выберет

  • имя продавца
  • имя последнего «клиента» (заявка)

НО ПРОБЛЕМА в том, что в одной таблице было два значения, поэтому для доступа к значению мне нужно сделать 2 выбора с разным ВНУТРЕННИМ СОЕДИНЕНИЕМ (посмотрите diag для понимания).

описание веб-сайта

Я сделал два выбора, но я не понимаю, как сделать один выбор.

     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
 

что у меня есть с двумя избранными

Сначала выберите

Пользователь имен
Джон

Второй выбор

Продавец имен
брайан

Что я хочу в одном выборе

Продавец имен Пользователь имен
брайан Джон

Файл в скрипт для создания таблицы и 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 


 

Ссылка для вставки значения

 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
 

Спасибо

Комментарии:

1. Примеры данных и ожидаемые результаты (в удобном для использования формате) помогут нам помочь вам.

2. Пожалуйста, опубликуйте код для создания таблицы и вставьте запросы для загрузки данных в таблицу или опубликуйте данные таблицы в виде табличной уценки.

3. Это не примерные данные, а всего лишь пара столбцов.

4. Извините, я просто публикую скрипт для создания и вставки, который я не очень хорошо понимаю

5. Вы можете использовать одну и ту же таблицу несколько раз в одном и том же запросе, каждый раз присваивая ей другой псевдоним.

Ответ №1:

Вы можете использовать ПЕРЕКРЕСТНУЮ ЗАЯВКУ, чтобы отозвать покупателя для каждого из продавцов. Учесть следующее:

  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
 

Комментарии:

1. Чем это отличается от второго внутреннего соединения на УТИЛИЗАТОРАХ? просто назовите его X «вместо u «…

Ответ №2:

  • лидер переместит текущую строку на 1 место выше
  • Объединение объединит данные в один столбец
  • у вас должен быть общий фактор, такой как дата для 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