1

出于这个问题的目的,以下是我的问题的简化。我有两张桌子。

表简介:

TABLE profile
profile_id  | first_name    | last_name
1           | David         | Battery
2           | John          | Motor

表 known_names:

TABLE known_names
profile_id  | first_name
1           | A
1           | B
1           | C
2           | X
2           | Y
2           | X

我想要实现的是在 profile.profile_id = known_names.profile_id 时将 known_names.first_name 与 profile.last_name 一起输出。但是我还想在结果的其中一行中打印出 profile.first_name 和 profile.last_name 。

所以查询可能看起来像这样(语法错误,我正在寻找正确的查询来执行此操作):

SELECT profile_id, first_name, last_name FROM profile CROSS JOIN known_names ON known_names.profile_id = profile.profile_id WHERE profile.first_name = 'David'

结果的一个例子是:

profile_id  | first_name    | last_name
1           | David         | Battery
1           | A             | Battery
1           | B             | Battery
1           | C             | Battery

我怎样才能编写一个可以实现这一目标的查询?

4

4 回答 4

2

试试这个::

   Select t.profileId, t.firstName, t.lastName
    FROM
(
SELECT 
        p.profile_id as profileId, 
        p.first_name as firstName, 
        p.first_name as first_Name,
        p.last_name as lastName
        FROM profile p

    UNION 

        SELECT 
        p.profile_id as profileId, 
        k.first_name as firstName,
        p.first_name as first_Name,
        p.last_name as lastName 
        FROM profile p, 
        known_names k
        WHERE  k.profile_id = p.profile_id
) t
where t.first_Name='David'

检查SQL-Fiddle

于 2013-02-10T07:15:24.253 回答
1

假设您可以使用 profile_id 作为查询的输入而不是 first_name:

SELECT
  p.profile_id AS profileId,
  p.first_name AS firstName,
  p.last_name AS lastName
  FROM profile p
  WHERE p.profile_id = 1

UNION

SELECT
  k.profile_id AS profileId,
  k.first_name AS firstName,
  p.last_name AS lastName
  FROM known_names k
  INNER JOIN profile p ON p.profile_id = k.profile_id
  WHERE k.profile_id = 1

http://www.sqlfiddle.com/#!2/fa421/18

于 2013-02-10T08:58:17.197 回答
1

我不得不承认我不经常使用GROUP BY WITH ROLLUP,但我想用它来回答你的问题而不使用 UNION 查询:

SELECT
  profile_id,
  COALESCE(first_name_k, first_name_p) First_Name,
  Last_Name
FROM (
  SELECT 
    p.profile_id, 
    k.first_name as first_name_k,
    p.first_name as first_name_p,
    p.last_name 
  FROM
    profile p inner join known_names k
    ON k.profile_id = p.profile_id
  WHERE
    p.first_name='David'
  GROUP BY
    p.profile_id,
    k.first_name WITH ROLLUP
  ) s
WHERE
  profile_id IS NOT NULL
ORDER BY
  first_name_k IS NOT NULL,
  COALESCE(first_name_k, first_name_p)

看到它在这里工作。

于 2013-02-10T09:56:37.617 回答
0

SELECT  a.*,
        b.first_name other_FirstName
FROM    profile a
        INNER JOIN known_names b
            ON a.profile_ID = b.profile_ID
// WHERE a.first_Name = ''
ORDER BY a.profile_id, a.first_Name

SELECT  a.*
FROM    profile a
WHERE   first_name = 'david'
UNION
SELECT  c.profile_id, c.first_name, d.last_name
FROM    profile b
        INNER JOIN known_names c
            ON b.profile_ID = c.profile_ID
        CROSS JOIN 
       (
          SELECT  last_Name
          FROM    profile 
          WHERE   first_name = 'david'
       ) d
WHERE   b.first_name = 'david'

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-02-10T07:14:04.493 回答