27

ユーザーが2つの関連するテーブルのいずれかにエントリを持っているかどうかを知りたいです。

テーブル

USER (user_id)
EMPLOYEE (id, user_id)
STUDENT (id, user_id)

ユーザーは、従業員および/または学生のエントリを持っている場合があります。1つのクエリでその情報を取得するにはどうすればよいですか?私は試した:

select * from [user] u
inner join employee e 
    on e.user_id = case when e.user_id is not NULL 
                        then u.user_id 
                        else null 
                   end
inner join student s 
    on s.user_id = case when s.user_id is not NULL 
                        then u.user_id 
                        else null 
                   end

ただし、両方のテーブルにエントリがあるユーザーのみが返されます。

SQLフィドルの例

4

7 に答える 7

29

外部結合を使用できます。

select *
  from USER u
  left outer join EMPLOYEE e ON u.user_id = e.user_id
  left outer join STUDENT s ON u.user_id = s.user_id
 where s.user_id is not null or e.user_id is not null

または(EMPLOYEEまたはSTUDENTテーブルのデータに関心がない場合)

select *
  from USER u
 where exists (select 1 from EMPLOYEE e where e.user_id = u.user_id)
    or exists (select 1 from STUDENT s  where s.user_id = u.user_id)
于 2012-04-23T10:57:45.597 に答える
9

すべてのユーザーデータをまとめたい場合は、次のようになります。

SELECT 
    user_id
    ,'Employee' AS Source
FROM 
    employee
UNION 
SELECT 
    user_id
    ,'Student' AS Source
FROM 
    student

http://sqlfiddle.com/#!3/90216/22

これは、完全結合とCASEステートメントを使用して実行することもできます。

SELECT 
    ISNULL(e.user_id,s.user_id) AS user_id
    ,CASE WHEN e.user_id IS NULL THEN 'Student' 
        ELSE 'Employee'
    END AS SOURCE
FROM 
    employee AS e 
    FULL JOIN student AS s
        ON s.user_id = e.user_id

http://sqlfiddle.com/#!3/90216/29

後者は、学生と従業員の両方である人々を1つの列にまとめ、それらを従業員と呼びます。比較:

http://sqlfiddle.com/#!3/2aa3e/1 および http://sqlfiddle.com/#!3/2aa3e/2

ユーザー1を学生と従業員にしたところ

于 2012-04-23T11:07:11.237 に答える
6

そのような解決策もあなたを助けることができます。

SELECT  S.*, P.*

,CASE
    WHEN S.ShipmentType = 'import' THEN SP.SupplierName
    WHEN S.ShipmentType = 'export' THEN C.CustomerName
END AS ShipmentDesination

FROM            tblShippments   S 
INNER JOIN      tblProducts     P   ON S.productId = P.productID  
LEFT OUTER JOIN tblCustomers    C   ON S.companyId = C.customerId AND S.ShipmentType = 'export'
LEFT OUTER JOIN tblSuppliers    SP  ON S.companyId = SP.supplierId AND S.ShipmentType = 'import'
于 2014-04-12T08:54:55.890 に答える
3

従業員と学生のテーブルを1つとして見る場合は、左結合を使用できます。

select * 
from user u
left join 
(
   select 'Employee' as UserType,
          id,
          user_id
     from employee e 
    union all
   select 'Student',
          id,
          user_id
     from student s 
) r
  ON u.user_id = r.user_id
于 2012-04-23T10:51:24.167 に答える
0

2つの別々のSELECTステートメントとして記述したUNIONはどうですか

例: SELECT * FROM User U JOIN Employee E ON E.User_Id = U.User_Id UNION SELECT * FROM User U JOIN student S ON S.User_Id = U.User_Id CASEステートメントが不要に見える理由がわかりませんでした。すべてのユーザーが必要で、nullを表示する場合は、LEFTOUTERJOINを使用します。

于 2012-04-23T11:01:54.143 に答える
0

mysql v5.6 +
スキーマで動作します:

CREATE TABLE USER (user_id INT);
CREATE TABLE employee (id INT, user_id INT);
CREATE TABLE student (id INT, user_id INT);

INSERT INTO USER SELECT 1;
INSERT INTO USER SELECT 2;
INSERT INTO USER SELECT 3;
INSERT INTO USER SELECT 4;

INSERT INTO employee SELECT 1, 1;
INSERT INTO employee SELECT 2, 4;

INSERT INTO student SELECT 1, 2;

最初の解決策、完全な外部結合はmysql v5.6+では機能しません:

 SELECT 
    IF(e.user_id IS NULL,s.user_id,e.user_id) AS user_id
    ,CASE WHEN e.user_id IS NULL THEN 'Student' 
        ELSE 'Employee'
    END AS SOURCE
FROM 
    employee AS e 
    LEFT JOIN student AS s
        ON (s.user_id = e.user_id)
    UNION
        SELECT 
    IF(e.user_id IS NULL,s.user_id,e.user_id) AS user_id
    ,CASE WHEN e.user_id IS NULL THEN 'Student' 
        ELSE 'Employee'
    END AS SOURCE
    FROM 
    employee AS e 
     RIGHT JOIN student AS s
        ON (s.user_id = e.user_id)

代替ソリューション:

SELECT   IF(e.user_id IS NULL,s.user_id,e.user_id) AS user_id,
 CASE WHEN e.user_id IS NULL THEN 'Student' 
            ELSE 'Employee'
        END AS SOURCE
 FROM   USER AS u
 LEFT OUTER JOIN employee e ON (u.user_id = e.user_id) 
 LEFT OUTER JOIN student s ON (u.user_id = s.user_id) 
 WHERE s.user_id IS NOT NULL OR e.user_id IS NOT NULL

その他の代替ソリューション:

 SELECT u.user_id,SOURCE 
FROM USER u
INNER JOIN 
(
   SELECT 'Employee' AS SOURCE,id,user_id FROM employee e 
    UNION ALL
   SELECT 'Student',id,user_id  FROM student s 
) r ON u.user_id = r.user_id
于 2021-08-27T17:02:26.560 に答える
-1
SELECT   OrderID, Quantity,  O.ProductID , ProductName,
CASE
WHEN Quantity > 3 THEN 'The quantity is More than 3'
WHEN Quantity = 3 THEN 'The quantity is Equal to  3'
ELSE 'The quantity is Less than 3'
END AS QuantityText

FROM            tb_OrderDetail O 
INNER JOIN      tb_Product     P   ON O.ProductID = P.ProductID
于 2020-05-06T12:42:15.863 に答える