2014-11-04 5 views
0

две таблицы (MasterTable с колоннами ID, Name) DetailTable с колоннами (MasterID, Status) теперь записи, показывая, как если бы я соединить две таблицы и поставить запрос какВыберите Distinct записей из двух таблиц

SELECT dbo.testMaster.Name,testDetail.Status 
FROM dbo.testDetail 
INNER JOIN dbo.testMaster ON dbo.testDetail.testID = dbo.testMaster.ID 

это показывает следующий результат

khalid  Pass 
Khalid  WithDraw 
Khalid  Fail 
Hamid  Fail 
Hamid  WithDraw 
Mike  WithDraw 

Я хочу, чтобы выбрать для Халида, если он «проходит» значение ден он должен пропустить вЫВЕСТИ и не для него. для Хамида у нас есть две записи, но приоритет должен идти на выход, поэтому он должен пропустить Fail for hamid. У Майка всего одна запись, поэтому он должен выбрать свою запись.

результат должен быть как

Khalid Pass 
Hamid WithDraw 
Mike WithDraw 
+0

Вы, по-видимому, используя SQL Server, почему вы отметите это также с 'oracle' –

+0

мы имеем как SQL и оракул базы данных. Эти базы данных синхронизируются. в любом случае спасибо. –

ответ

0
SELECT dbo.testMaster.Name, 
     case min(case testDetail.Status 
        when 'Pass' then 1 
        when 'WithDraw' then 2 
        when 'Fail' then 3 
       end) 
      when 1 then 'Pass' 
      when 2 then 'WithDraw' 
      when 3 then 'Fail' 
     end 
FROM dbo.testDetail 
INNER JOIN dbo.testMaster ON dbo.testDetail.testID = dbo.testMaster.ID 
GROUP BY dbo.testMaster.Name; 

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

+0

Great wow thanksssss –

0

Использование Case statement присвоить приоритет и выбрать мин один для всех пользователей. Попробуй это.

CREATE TABLE #result 
    (
    NAME VARCHAR(50), 
    stat VARCHAR(50) 
) 

INSERT INTO #result 
VALUES  ('khalid','Pass'), 
      ('Khalid','WithDraw'), 
      ('Khalid','Fail'), 
      ('Hamid','Fail'), 
      ('Hamid','WithDraw'), 
      ('Mike','WithDraw') 

WITH cte 
    AS (SELECT CASE stat 
        WHEN 'pass' THEN 1 
        WHEN 'WithDraw' THEN 2 
        ELSE 3 
       END priority, 
       * 
     FROM #result) 
SELECT a.NAME, 
     a.stat 
FROM cte a 
     JOIN(SELECT Min(priority) priority, 
        NAME 
      FROM cte 
      GROUP BY NAME) b 
     ON a.priority = b.priority 
      AND a.NAME = b.NAME 

Выход

name stat 
----- -------- 
Hamid WithDraw 
khalid Pass 
Mike WithDraw 
+0

Отлично :) спасибо Pradeeb –

1

Другой способ:

SELECT 
    * 
FROM (SELECT 
    dbo.testMaster.Name 
    ,testDetail.Status 
    ,ROWN = ROW_NUMBER() OVER (PARTITION BY dbo.testMaster.Name ORDER BY 
    CASE 
     WHEN testDetail.Status = 'Pass' THEN 3 
     WHEN testDetail.Status = 'WithDraw' THEN 2 
     WHEN testDetail.Status = 'Fail' THEN 1 
     ELSE 0 
    END DESC 
    ) 

FROM dbo.testDetail 
JOIN dbo.testMaster 
    ON dbo.testDetail.testID = dbo.testMaster.ID) a 
WHERE ROWN = 1 
Смежные вопросы