【问题标题】:Checking existence of user id in separate table - T-SQL检查单独表中是否存在用户 ID - T-SQL
【发布时间】:2009-07-27 14:15:00
【问题描述】:

我这里有一个真正的dailyWTF。我们有一个帐户注册页面,可以按顺序列出新帐号。我们遇到的问题有两个。对于一个,我们让已经拥有客户 ID 的客户注册另一个客户 ID。为了解决这个问题,我们在表单中添加了一个“当前客户 ID”字段,以便他们可以输入他们当前的客户 ID,唯一的问题是他们仍然被分配了一个客户 ID。

第二个问题是我们的订单输入软件中的实际客户数据库与该数据库不匹配。

我们要做的是选择并测试客户是否存在于订单输入软件数据库中。

数据如下:

注册表格

name    | id | id2
-----------------------
Bill    | 1  | NULL
Jim     | 2  | NULL
Sue     | 3  | NULL
Bob     | 4  | NULL
Author  | 5  | NULL
Bill    | 6  | 1
Sue     | 7  | 3

OrderEntry 表

name    | id
-----------------------
Bill    | 1 
Sue     | 3
Author  | 5 

查询结果

name    | id | id2  |id1 Exists | id2 Exists
---------------------------------------------
Bill    | 1  | NULL |Yes        | No
Jim     | 2  | NULL |No         | No
Sue     | 3  | NULL |Yes        | No
Bob     | 4  | NULL |No         | No
Author  | 5  | NULL |Yes        | No
Bill    | 6  | 1    |No         | Yes
Sue     | 7  | 3    |No         | Yes

【问题讨论】:

  • “查询结果”是您正在制作的东西……还是您希望能够制作的东西?
  • @davidsleeps - 根据这个问题,他似乎正在研究“如何”创建结果

标签: sql join


【解决方案1】:

我认为您正在寻找类似的东西。因为您不显示软件系统表我不确定,除非您对 id2 列进行简单的空检查。如果只做空检查,则不需要这里的第二个连接。

SELECT
    S.Name,
    S.id, 
    S.id2,
    CASE OE.ID
    WHEN NULL THEN 'No'
    ELSE 'Yes'
    AS "ID1Exists",
    CASE OS.id
    WHEN NULL THEN 'No'
    ELSE 'Yes'
    AS "ID2Exists"
FROM Signup S
    LEFT OUTER JOIN OrderEntry OE
    ON (S.id = OE.Id)
    LEFT OUTER JOIN OrderSoftware OS
    ON (s.id2 = OS.id)

这将按照您需要的方式返回结果集,如果 ID 2 的结果基于 id2 列中的 null,您将使用此查询。

SELECT
    S.Name,
    S.id, 
    S.id2,
    CASE OE.ID
    WHEN NULL THEN 'No'
    ELSE 'Yes'
    AS "ID1Exists",
    CASE S.id2
    WHEN NULL THEN 'No'
    ELSE 'Yes'
    AS "ID2Exists"
FROM Signup S
    LEFT OUTER JOIN OrderEntry OE
    ON (S.id = OE.Id)

【讨论】:

    【解决方案2】:

    SQL Server:

    SELECT  s.*,
            (
            SELECT  TOP 1 1
            FROM    orderEntry oe
            WHERE   oe.id = s.id
            ),
            (
            SELECT  TOP 1 1
            FROM    orderEntry oe
            WHERE   oe.id = s.id2
            )
    FROM    signup s
    

    MySQLPostgreSQL

    SELECT  s.*,
            (
            SELECT  1
            FROM    orderEntry oe
            WHERE   oe.id = s.id
            LIMIT 1
            ),
            (
            SELECT  TOP 1 1
            FROM    orderEntry oe
            WHERE   oe.id = s.id2
            )
    FROM    signup s
    

    Oracle:

    SELECT  s.*,
            (
            SELECT  1
            FROM    orderEntry oe
            WHERE   oe.id = s.id
                    AND rownum = 1
            ),
            (
            SELECT  1
            FROM    orderEntry oe
            WHERE   oe.id = s.id2
                    AND rownum = 1
            )
    FROM    signup s
    

    如果行存在则返回1,否则返回NULL

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多